更新指定文章时报错,Node.js RestAPI PUT请求调用Article.updateOne无更新效果
PUT请求更新无效问题排查及修复方案
1. 确认请求体解析中间件已配置
如果服务端使用Express框架,必须显式开启请求体解析中间件才能正确拿到req.body的值,否则req.body.title、req.body.content均为undefined,更新操作会写入空值,看起来没有更新效果。请在路由代码前添加以下配置:
// 解析JSON格式的请求体 app.use(express.json()) // 解析表单格式的请求体(如果用Postman传表单格式参数才需要加) app.use(express.urlencoded({extended: true}))
2. 确认Postman请求配置正确
- 请求Body格式要和服务端解析逻辑匹配:传JSON参数需选择
raw->JSON,传表单参数需选择x-www-form-urlencoded - 提交的参数键名必须和代码中取值的
title、content完全一致,无拼写错误 - 路径参数
articleTitle必须和数据库中已存储的文章标题完全匹配(区分大小写、空格),否则匹配不到目标文档,就不会执行更新,且此时接口依然会返回成功提示。
3. 修复Mongoose更新方法写法
updateOne配合overwrite: true的写法,在Mongoose 6.0及以上版本已经不被支持,PUT请求本身是全量替换语义,更推荐使用replaceOne方法,同时可以添加匹配结果判断,方便定位问题:
.put(function(req, res){ Article.replaceOne( {title: req.params.articleTitle}, {title: req.body.title, content: req.body.content}, function(err, result){ if (!err){ // 判断是否匹配到目标文档 if(result.matchedCount === 0) { return res.send("未找到匹配的文章,未执行更新操作"); } res.send("Successfully updated the content of the selected article."); }else{ res.send(err); } } ); });
4. 其他低概率问题排查
确认MongoDB连接账号有对应集合的写入权限,无只读限制。
内容的提问来源于stack exchange,提问作者Abhijith Poojary
相关产品推荐
相关产品推荐

