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

Express使用Mongoose插入MongoDB数据时req.body为undefined仅生成默认_id

问题根因

req.body返回undefined、自定义字段写入失败,本质是请求体没有被你注册的bodyParser.json()中间件正常解析,结合你的代码场景,问题基本出在Postman请求配置上:
bodyParser.json()只会处理请求头Content-Type为application/json的请求,如果你在Postman里没选对发送格式,或者发送的JSON语法不符合规范,中间件不会执行解析逻辑,req.body就会是undefined,这时候你给Mongoose传的name、price都是undefined,文档自然只会生成默认的_id字段。

修复方法
  1. 修正Postman发送配置
    进入Postman请求的Body设置页:
    • 选中raw发送模式
    • 右侧格式下拉菜单必须选JSON,不要选Text、Javascript等其他类型
    • 输入标准JSON参数,所有键名必须用双引号包裹:
    {
      "name": "wewe",
      "price": 43
    }
    
    你之前写的参数里name、price都没加双引号,不是合法JSON,也会导致解析失败。
  2. 修正响应状态码写法(非必填,但避免隐性bug)
    Express的res.json()方法只接收响应体作为唯一参数,设置状态码需要单独调用status()方法,把路由里的响应代码改成:
    post.save(function (err, post) {
        if (err) { return next(err) }
        res.status(201).json(post)
    })
    
  3. 排查验证
    改完配置重新发请求,你的控制台会正常打印Log wewe,数据库里也能看到name、price字段正常写入。如果还是异常,可以在路由前加一行调试日志确认解析结果:
    app.use(bodyParser.json())
    // 加这行调试
    app.use((req, res, next) => {
      console.log('解析后的请求体:', req.body)
      next()
    })
    
    如果日志能正常打印出传入的name和price,说明解析逻辑正常。
扩展说明

如果你后续需要接收表单类请求:

  • 普通键值对表单(x-www-form-urlencoded格式):需要额外加一行中间件app.use(express.urlencoded({extended: true})),不需要额外装body-parser,Express 4.16+版本已经内置了解析方法
  • 带文件上传的表单(multipart/form-data格式):body-parser不支持这类请求解析,需要引入multer等专门的multipart解析中间件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:06:21