创建REST API时DELETE方法返回404错误如何解决
故障原因
路由完全不匹配的核心原因是路由参数语法写错:
Express框架中,动态路由参数的语法要求是冒号:必须紧跟在参数名之前,用来标识这一段是动态匹配的参数。你当前定义的路由路径是/students:/id,冒号错放在了students片段后方,实际定义的是一个完全静态的路径,只能匹配地址为/students:/id的DELETE请求,完全匹配不上你发起的/students/62b93a487624a06ef8756439这类带id参数的请求,因此服务端直接返回路径不存在的404响应,根本不会进入你写的回调函数,自然也不会打印in delete日志。
除了核心的路由语法错误,代码里还有3处会导致逻辑异常的问题:
findOneAndDelete方法传参错误:不能直接传入id字符串,需要传入查询条件对象,否则数据库查询逻辑不生效- 响应链式调用顺序错误:
res.send()执行后会立即向客户端返回响应,后续的.status(200)不会生效,状态码设置必须放在send()之前 - 参数校验逻辑位置错误:
req.params.id是路由匹配成功后就会存在的参数,放在数据库操作之后做非空判断完全没有拦截意义
修正后可运行代码
// 修正路由路径为正确的动态参数写法 app.delete("/students/:id", async (req, res) => { console.log("in delete") try { const _id = req.params.id // 修正查询方法传参,传入_id匹配的条件对象 const delete_student = await Student.findOneAndDelete({ _id }) console.log(req.params.id) // 提前做参数和查询结果校验,不存在对应数据直接返回400 if(!_id || !delete_student){ return res.status(400).send() } // 修正响应顺序,先设置状态码再返回内容 res.status(200).send(delete_student) } catch (error) { res.status(500).send(error) } })
验证方式
修正后重新启动服务,向/students/62b93a487624a06ef8756439地址发起DELETE请求,即可正常进入路由回调,控制台会打印预期日志,不会再返回Cannot DELETE的错误页面。
内容的提问来源于stack exchange,提问作者MilesMorales314
相关产品推荐
相关产品推荐

