Express无法读取req.body 发送POST请求写入MongoDB出现异常
问题根因
你遇到的问题核心是Express没有正确解析POST请求的JSON请求体,导致req.body为空,所以schema的required校验不会触发,调用Tour.create时只会插入字段的默认值。
解决方案
按以下顺序排查即可解决:
- 补充JSON解析中间件
Express 4.16.0及以上版本内置了JSON请求体解析能力,你需要在项目入口文件(通常是app.js/server.js)中、注册路由之前添加如下配置:
app.use(express.json())
如果你用的是更早的Express版本,需要先安装body-parser依赖,再添加配置:
const bodyParser = require('body-parser') app.use(bodyParser.json())
- 校验请求配置
检查你发送POST请求的工具(Postman/ApiFox等)的配置:
- 请求头必须携带
Content-Type: application/json - 请求体选择JSON格式,不要选form-data、x-www-form-urlencoded等其他格式
- 校验JSON格式是否正确,避免存在语法错误导致解析失败
- 检查中间件执行顺序
必须保证解析请求体的中间件配置在路由注册之前,示例正确顺序如下:
// 先配置解析中间件 app.use(express.json()) // 再注册路由 app.use('/api/tours', tourRouter)
如果把中间件写在路由注册之后,请求进入路由时还没经过解析,就会拿到空的req.body。
- 快速排查验证
你可以在createTour逻辑最开头加一行日志打印,确认请求体是否正确拿到:
exports.createTour = async (req, res) => { // 新增日志,发请求后查看终端输出 console.log('请求体内容:', req.body) try { const newTour = await Tour.create(req.body); res.status(201).json({ status: 'success', data: { tour: newTour, }, }); } catch (err) { res.status(404).json({ status: 'fail', message: err.message, }); } };
如果输出为空对象,就可以确定是请求解析环节的问题,按上面的步骤排查即可。
内容的提问来源于stack exchange,提问作者Stat_prob_001
相关产品推荐
相关产品推荐

