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

