开发Express待办清单时update/delete路由无报错却不生效
问题根源
你没有引入mongoose不会导致操作失效,原生MongoDB Node驱动本身就支持findOneAndUpdate、findOneAndDelete方法,当前操作不生效的核心原因是类型不匹配:
- 前端传到后端的
todoId是字符串格式 - MongoDB中存储的
_id是ObjectId类型,直接用字符串匹配无法命中对应文档,所以操作不会生效,也不会抛出错误
修复步骤
第一步:引入ObjectId工具
修改server.js头部的mongodb导入语句,引入ObjectId:
// 把原来的这行 const { request } = require("mongodb"); // 替换为 const { request, ObjectId } = require("mongodb");
第二步:修改所有_id查询的逻辑
把server.js中三个操作接口里的_id查询条件,都改成转换为ObjectId的格式:
- 标记完成接口
/markComplete的查询条件:
{ _id: ObjectId(req.body.todoId), }
- 标记未完成接口
/markIncomplete的查询条件和上面一致 - 删除接口
/deleteToDo的查询条件也改为_id: ObjectId(req.body.todoId)
第三步:放开标记完成后的页面刷新逻辑
main.js里的completeToDoFunc方法中,你注释了location.reload(),放开这行注释,否则标记完成后页面不会刷新,看不到状态变更。
可选排查技巧
你可以在接口操作后打印下方法返回的结果,确认是否匹配到了文档:比如findOneAndUpdate返回的结果里有lastErrorObject.n字段,如果值为1说明匹配到了文档,为0说明没匹配到,方便后续排查。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

