使用Node.js Mongoose实现删除功能时报404错误如何解决
Mongoose删除接口返回404问题排查及修复方案
404错误核心原因排查
- 请求配置不匹配:调用接口时未使用
DELETE请求方法,或请求路径与/tm/v1/tasks不完全一致,包括多写尾斜杠、路径段拼写错误、漏加全局路由前缀(如有app.use挂载路由的场景) - 路由注册顺序错误:该DELETE路由注册在Express全局404处理中间件之后,请求会被优先匹配到404中间件直接返回
- 路由规则不匹配:如果实际是按RESTful规范把id放在路径参数(如
/tm/v1/tasks/:id),但请求时未携带路径id,会无法命中路由返回404
原有代码存在的其他逻辑错误
就算404问题修复,现有代码也无法正常运行,存在以下问题:
findOneAndDelete第一个参数需传入查询条件对象,直接传入req.body.id无法匹配到数据- 错误分支未加return,报错后仍会执行后续响应逻辑,导致重复设置响应头报错
- 变量名不匹配:回调参数名为
car但返回时用了tasks,错误变量捕获为err但返回时用了error,都会触发未定义报错
修复后的完整代码
// 如果id放在请求body中,使用该路由 app.delete("/tm/v1/tasks", (req, res) => { Task.findOneAndDelete({_id: req.body.id}, (err, deletedTask) => { if (err){ return res.status(500).json({msg: err}); } res.status(200).json({task: deletedTask}); }) }); // 更符合RESTful规范的写法,id放在路径参数中,请求路径为 /tm/v1/tasks/【数据id】 app.delete("/tm/v1/tasks/:id", (req, res) => { Task.findOneAndDelete({_id: req.params.id}, (err, deletedTask) => { if (err){ return res.status(500).json({msg: err}); } res.status(200).json({task: deletedTask}); }) });
内容的提问来源于stack exchange,提问作者Marcus Boobly
相关产品推荐
相关产品推荐

