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

Express无法读取req.body 发送POST请求写入MongoDB出现异常

问题根因

你遇到的问题核心是Express没有正确解析POST请求的JSON请求体,导致req.body为空,所以schema的required校验不会触发,调用Tour.create时只会插入字段的默认值。

解决方案

按以下顺序排查即可解决:

  1. 补充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())
  1. 校验请求配置
    检查你发送POST请求的工具(Postman/ApiFox等)的配置:
  • 请求头必须携带Content-Type: application/json
  • 请求体选择JSON格式,不要选form-data、x-www-form-urlencoded等其他格式
  • 校验JSON格式是否正确,避免存在语法错误导致解析失败
  1. 检查中间件执行顺序
    必须保证解析请求体的中间件配置在路由注册之前,示例正确顺序如下:
// 先配置解析中间件
app.use(express.json())
// 再注册路由
app.use('/api/tours', tourRouter)

如果把中间件写在路由注册之后,请求进入路由时还没经过解析,就会拿到空的req.body。

  1. 快速排查验证
    你可以在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:24:01