请求中的JSON数据怎么接收和解析_接收API请求【教程】

1次阅读

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

请求中的JSON数据怎么接收和解析_接收API请求【教程】

JSON 数据不是“接收”出来的,而是从请求体里读出来再解析的;不手动读取原始流,直接拿 req.body 大概率是 undefined

为什么 req.bodyundefined

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),中间件就直接跳过解析,你还以为是代码逻辑问题。

text=ZqhQzanResources