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

使用Express、Node.js、Mongoose、EJS删除对象时报错如何解决?

问题原因
  • 首先,HTML的<a>标签默认只能发送GET请求,你的后端删除路由是通过DELETE方法注册的(Postman测试时你选择的请求方法就是DELETE,所以可以正常执行),浏览器发送GET请求无法匹配到对应的DELETE路由,因此返回404 Cannot GET错误。
  • 其次你贴出的EJS代码里删除按钮的链接路径写错了,写的是更新接口路径/halalMunchies/update-category/,和实际删除接口路径不匹配。
  • 额外问题:你现有删除路由代码里的res.send(console.log(result))写法错误,console.log()没有返回值,会导致前端接收到空响应。
解决方案

根据你的技术栈和需求可以选择以下任意一种方案:

方案1:临时兼容修改(不推荐,不符合REST规范,存在安全风险)

直接把后端删除路由的请求方法从DELETE改为GET,同时修正EJS里的链接路径:

  1. 修正路由注册代码:把原有的app.delete('/halalMunchies/delete-category/:id', exports.deleteCategory)改为app.get('/halalMunchies/delete-category/:id', exports.deleteCategory)
  2. 修正EJS代码:
<center> <a class="delete_category_a" href="/halalMunchies/delete-category/<%= category._id%>" style="color: red "> Delete </a> </center>
  1. 修正删除路由里的响应逻辑,把res.send(console.log(result))改为你注释掉的重定向逻辑:res.redirect('/halalMunchies/all-categories')

方案2:使用表单+方法覆盖(符合REST规范,无前端JS依赖)

  1. 安装并配置method-override中间件,让后端支持解析表单伪装的DELETE请求:
// 安装命令:npm install method-override
const methodOverride = require('method-override');
app.use(methodOverride('_method'));
  1. 把EJS里的a标签替换为表单提交按钮:
<center>
  <form action="/halalMunchies/delete-category/<%= category._id%>" method="POST">
    <input type="hidden" name="_method" value="DELETE">
    <button type="submit" class="delete_category_a" style="color: red;background:none;border:none;cursor:pointer;">Delete</button>
  </form>
</center>
  1. 同样修正删除路由的响应逻辑即可。

方案3:AJAX异步提交(体验最优,无需刷新页面)

  1. 修改EJS里的a标签,绑定点击事件:
<center> <a class="delete_category_a" href="javascript:;" data-id="<%= category._id%>" style="color: red "> Delete </a> </center>
  1. 页面添加JS逻辑发送DELETE请求:
document.querySelectorAll('.delete_category_a').forEach(item => {
  item.addEventListener('click', async function() {
    const id = this.dataset.id;
    await fetch(`/halalMunchies/delete-category/${id}`, {
      method: 'DELETE'
    });
    // 删除成功后刷新页面或者跳转列表页
    window.location.replace('/halalMunchies/all-categories');
  })
})
  1. 可以把删除路由的响应改为返回JSON,方便前端判断状态:
categorySchema.findByIdAndDelete(id)
  .then(result => {
    res.json({ success: true })
  })
  .catch(err => {
    console.log(err);
    res.status(500).json({ success: false })
  });

内容的提问来源于stack exchange,提问作者Hesham Eldawy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:54:02