You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node/Express已配置express.json()仍出现res.body为undefined问题求解

问题原因

  • 基础笔误:你代码中打印的是res.body,Express框架中客户端提交的请求体仅挂载在**请求对象req**上,res是服务端用来返回响应的对象,本身不存在body属性,因此直接打印必然返回undefined。
  • 跨域配置冲突且不符合规范:
    • 同时使用cors第三方包和自定义CORS中间件,两者配置互相冲突。cors包配置了origin: '*',但同时开启了credentials: true,携带身份凭证的跨域请求不允许Origin设置为通配符*,会直接导致跨域校验失败,也可能干扰后续请求体解析。
    • 自定义CORS中间件又单独指定了Origin为http://localhost:4200,和cors包的配置冲突,会导致请求头异常。
  • 解析中间件重复冗余:
    • Express 4.16以上版本已经内置了urlencoded、json格式的解析能力,不需要额外引入bodyParser包,你同时配置了express.urlencoded和bodyParser.urlencoded,重复的解析中间件会干扰请求体的正常处理。
  • 负载大小限制不足:Base64编码的体积比原二进制文件大33%左右,8张1.5Mb的图片编码后总大小可能超过你设置的50Mb限制,导致请求体解析被截断,最终解析结果为空。
  • 中间件顺序问题:如果你的身份校验中间件ensureLoggedIn加载在解析中间件之前,且中间件内部提前消费了请求流,也会导致后续解析中间件无法正常读取请求体。

解决步骤

  • 修正打印变量,将路由中的console.log(res.body)修改为console.log(req.body)。
  • 清理跨域配置,二选一即可,推荐直接使用cors包的配置,删除自定义CORS中间件,调整配置符合跨域凭证要求:
// 替换原有cors配置和自定义cors中间件
app.use(cors({
   origin: 'http://localhost:4200',
   credentials: true,
   allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization'],
   methods: ['POST', 'GET', 'OPTIONS']
}))
  • 清理重复的解析中间件,删除bodyParser相关代码,调整解析中间件顺序,确保在所有业务中间件、路由之前加载,同时放大负载限制避免体积超限:
app.use(cookieParser())
// 解析中间件放在最前面,优先处理请求体
app.use(express.json({ limit: '100mb' }))
app.use(express.urlencoded({ extended: true, limit: '100mb' }))
// 删除原来的app.use(bodyParser.urlencoded({ extended: true })) 代码
  • 检查ensureLoggedIn中间件的逻辑,确认身份校验通过后会调用next()将请求传递到后续逻辑,没有提前结束请求或者消费请求流。

内容的提问来源于stack exchange,提问作者user2272048

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:24:01