You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:57:20