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,重复的解析中间件会干扰请求体的正常处理。
- Express 4.16以上版本已经内置了urlencoded、json格式的解析能力,不需要额外引入
- 负载大小限制不足: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
相关产品推荐
相关产品推荐

