Express+Mongoose开发REST API时PUT请求报错无法读取undefined的title属性
问题根因
报错TypeError: Cannot read properties of undefined (reading 'title')由两处代码问题直接导致:
- 你虽然引入了
body-parser依赖,但没有注册对应的请求体解析中间件,所有PUT/POST请求携带的参数不会被解析挂载到req.body上,req.body实际值为undefined,读取title属性直接触发类型错误,对应报错指向的app.js第83行就是你写{ title: req.body.title, content: req.body.content }的位置。 - PUT接口里
Article.updateOne的回调函数参数命名为res,和路由层的Express响应对象res重名,形成变量遮蔽,就算修好请求体解析的问题,这里执行res.send()时也会因为调用的不是Express响应对象而二次报错。 - 额外注意:Postman发请求时要选对请求体格式,要么选
x-www-form-urlencoded传参,要么选raw-JSON传参,要和服务端配置的解析规则匹配。
修复方法
- 在路由定义前补全请求体解析中间件配置,放在
app.use(express.static("public"));这行下面即可:
// 解析x-www-form-urlencoded格式请求体 app.use(bodyParser.urlencoded({ extended: true })); // 解析JSON格式请求体 app.use(express.json());
- 修改PUT接口的数据库操作逻辑,修正回调参数命名冲突,全量更新场景直接用
replaceOne语义更准确,不需要额外传overwrite参数:
.put(function (req, res) { Article.replaceOne( { title: req.params.articleTitle }, { title: req.body.title, content: req.body.content }, function (err, result) { if (!err) { res.send("successfully updated article!"); } else { res.send(err); } } ); });
- 保存代码重启服务,再用Postman发PUT请求即可正常更新数据。
内容的提问来源于stack exchange,提问作者Darshan Verma
相关产品推荐
相关产品推荐

