req.body 为 undefined 是因 node.js 原生 http 和 express 默认不解析 json 请求体,需显式配置 express.json() 中间件,且须在路由前注册;其 limit、type、verify 等参数影响解析行为,content-type 校验缺失亦会导致解析跳过。

JSON 数据不是“接收”出来的,而是从请求体里读出来再解析的;不手动读取原始流,直接拿 req.body 大概率是 undefined。
为什么 req.body 是 undefined?
Node.js 原生 http 模块根本不解析请求体,Express 默认也不处理 JSON——你得显式告诉它“接下来会收到 JSON”。没配中间件,req.body 就永远空。
- 常见错误现象:
console.log(req.body)输出{}或undefined,但用 postman 发的明明是合法 JSON - 使用场景:POST/PUT 请求头含
Content-Type: application/json - 必须加中间件:
app.use(express.json())(注意不是express.urlencoded()) - 顺序很重要:中间件得在路由定义之前注册,否则不生效
express.json() 的参数影响什么?
它不只是“开个开关”,几个关键参数直接决定你能拿到什么数据。
-
limit:默认只收 100kb,上传大 JSON(比如带 base64 图片)会直接 413 错误,得设成limit: '10mb' -
type:默认只处理application/json,如果前端发的是application/vnd.api+json,得手动加:type: ['application/json', 'application/vnd.api+json'] -
verify:调试时可加简单校验,比如拒绝空 body:verify: (req, res, buf) => { if (buf.Length === 0) throw new Error('Empty body'); }
不用 Express 怎么读 JSON?
原生 Node 或轻量框架(如 Fastify、Elysia)不走 req.body 那套,得自己拼接流、转字符串、再 JSON.parse()。
- 常见错误:用
req.on('data')直接JSON.parse(chunk)—— chunk 是二进制分片,可能截断 JSON 结构 - 正确做法:收集所有
data片段 →Buffer.concat()→toString()→JSON.parse() - 示例片段:
let body = []; req.on('data', chunk => body.push(chunk)); req.on('end', () => { const json = JSON.parse(Buffer.concat(body).toString()); }); - 风险点:没设超时或大小限制,恶意大请求会吃光内存
最常被忽略的其实是 Content-Type 校验——后端不检查 header,前端发错类型(比如 text/plain),中间件就直接跳过解析,你还以为是代码逻辑问题。