nodejs如何接收post请求
```html 去年帮朋友调一个上传接口,他用 Node 自带的 这段代码能跑,请求但实际项目里没人这么写。何接手动拼字符串、处理编码、判断 Content-Type、限制大小防止内存炸掉——全是体力活。我试过在一个小工具里用原生写法,结果前端传了个 Express 把上面那堆脏活封装成了中间件。关键就两行: 然后路由里直接读 有个细节:这两个中间件必须放在路由之前。我见过有人写在 Koa 更原始,连路由都不自带。你得装 然后 我个人的选择:小项目 Express 一把梭,追求性能上 Fastify,Koa 现在用得少了——生态没前两者热闹。 前端用 不加这个 header,Express 的 还有文件上传。 注意 我现在写 Express 项目,习惯在入口文件顶部就挂好 另外,生产环境记得加错误处理中间件,捕获 JSON 解析失败的情况——不然用户传个畸形 JSON,服务端直接抛异常,体验很差。 差不多就这些。核心就一句话:用框架的 body parser 中间件,注意 Content-Type 和中间件顺序。剩下的都是细节,踩几次就记住了。req.body 死活拿不到数据,请求控制台打印出来是何接 undefined。代码翻了三遍没毛病,请求最后发现——他忘了加 express.urlencoded()。何接这种坑我踩过不止一次,请求所以今天不绕弯子,何接直接说 Node.js 里接 POST 请求到底怎么搞。请求原生 http 模块:最笨但最明白的何接方式
http 模块不帮你解析请求体。POST 发过来的请求数据是一段流(stream),你得自己监听 data 和 end 事件,何接把 Buffer 拼起来。请求const http = require('http'); http.createServer((req,何接 res) => { if (req.method === 'POST') { let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { console.log('原始数据:', body); // 如果是 JSON 格式,还得手动 parse try { const data = JSON.parse(body); res.end('收到了: ' + data.name); } catch (e) { res.statusCode = 400; res.end('JSON 格式不对'); } }); } }); multipart/form-data,解析边界字符串直接把我劝退。Express:加两行中间件就完事
app.use(express.json()); // 解析 application/json app.use(express.urlencoded({ extended: true })); // 解析表单 req.body 就行。注意 extended: true 和 false 的区别:前者用 qs 库,支持嵌套对象;后者用 Node 内置的 querystring,只能处理简单键值对。我一般无脑写 true,除非有安全洁癖。app.post('/login', (req, res) => { const { username, password } = req.body; console.log(username, password); res.json({ ok: true }); }); app.post 后面,然后抱怨 req.body 是空对象。Express 的中间件执行顺序是严格从上到下的,别搞反。Koa 和 Fastify 的差异
koa-bodyparser:const bodyParser = require('koa-bodyparser'); app.use(bodyParser()); ctx.request.body 就能用了。Fastify 则内置了 body 解析,但默认只认 application/json 和 text/plain。要收表单得加 @fastify/formbody 插件。踩坑提醒:Content-Type 必须对
fetch 发 POST,如果 body 是 JSON 字符串,记得加 header:fetch('/api', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'test' }) }); express.json() 直接跳过解析,req.body 就是 { }。我见过有人用 axios 没这个问题,因为 axios 自动帮你设了。但用原生 fetch 或 postman 测试时,这个细节能卡你半小时。express.json() 和 urlencoded() 都处理不了 multipart/form-data,得用 multer 或 formidable。multer 的用法大概是:const multer = require('multer'); const upload = multer({ dest: 'uploads/' }); app.post('/upload', upload.single('file'), (req, res) => { console.log(req.file); res.end('ok'); }); upload.single() 里的字段名要和前端 FormData 的 key 一致,否则 req.file 是 undefined。这个错误我犯过两次,两次都花了十分钟才反应过来。一点个人习惯
express.json({ limit: '1mb' }),限制请求体大小。默认 100kb 对普通接口够用,但传 base64 图片就不行了。设个 1mb 或 5mb,心里踏实。
-
上一篇
-
下一篇
- 随机阅读
- 搜索
-
- 友情链接
-