原生JS(Vanilla Js)Ajax发送POST请求后Express req.body为空的问题
根因定位
- 前端XHR发送POST请求时,显式设置请求头
Content-Type: application/json,通过JSON.stringify将数组序列化为JSON字符串作为请求载荷。 - 服务端仅注册了
express.urlencoded({extended:true})中间件,该中间件仅支持解析application/x-www-form-urlencoded格式的表单请求体,不具备JSON格式请求体的解析能力,请求内容不会被挂载到req.body上,因此打印结果始终为空对象。
修复方案
- 在服务端中间件配置段,补充Express内置的JSON解析中间件,注意所有请求体解析中间件必须注册在所有路由处理逻辑之前,与现有urlencoded中间件相邻放置即可:
说明:Express 4.16及以上版本已内置该JSON解析能力,无需额外安装// 新增以下代码,专门解析application/json格式的请求体 app.use(express.json()); app.use(express.urlencoded({extended:true}));body-parser第三方依赖。 - 修复完成后重新触发前端POST请求,服务端
req.body会正常接收到前端发送的['xyz']数组数据,不再出现空对象问题。
避坑提示
- 请求体解析类中间件的注册顺序必须早于对应路由的处理逻辑,如果将中间件写在路由定义之后,解析逻辑完全不会生效。
- 无需强行修改前端
Content-Type配置适配现有中间件,如果改为表单格式提交,需要手动对前端发送的数组/对象做表单序列化处理,否则依然会出现req.body为空的问题。
内容的提问来源于stack exchange,提问作者user15573857
相关产品推荐
相关产品推荐

