使用Express、Node.js、Mongoose、EJS删除对象时报错如何解决?
问题原因
- 首先,HTML的
<a>标签默认只能发送GET请求,你的后端删除路由是通过DELETE方法注册的(Postman测试时你选择的请求方法就是DELETE,所以可以正常执行),浏览器发送GET请求无法匹配到对应的DELETE路由,因此返回404Cannot GET错误。 - 其次你贴出的EJS代码里删除按钮的链接路径写错了,写的是更新接口路径
/halalMunchies/update-category/,和实际删除接口路径不匹配。 - 额外问题:你现有删除路由代码里的
res.send(console.log(result))写法错误,console.log()没有返回值,会导致前端接收到空响应。
解决方案
根据你的技术栈和需求可以选择以下任意一种方案:
方案1:临时兼容修改(不推荐,不符合REST规范,存在安全风险)
直接把后端删除路由的请求方法从DELETE改为GET,同时修正EJS里的链接路径:
- 修正路由注册代码:把原有的
app.delete('/halalMunchies/delete-category/:id', exports.deleteCategory)改为app.get('/halalMunchies/delete-category/:id', exports.deleteCategory) - 修正EJS代码:
<center> <a class="delete_category_a" href="/halalMunchies/delete-category/<%= category._id%>" style="color: red "> Delete </a> </center>
- 修正删除路由里的响应逻辑,把
res.send(console.log(result))改为你注释掉的重定向逻辑:res.redirect('/halalMunchies/all-categories')
方案2:使用表单+方法覆盖(符合REST规范,无前端JS依赖)
- 安装并配置
method-override中间件,让后端支持解析表单伪装的DELETE请求:
// 安装命令:npm install method-override const methodOverride = require('method-override'); app.use(methodOverride('_method'));
- 把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>
- 同样修正删除路由的响应逻辑即可。
方案3:AJAX异步提交(体验最优,无需刷新页面)
- 修改EJS里的a标签,绑定点击事件:
<center> <a class="delete_category_a" href="javascript:;" data-id="<%= category._id%>" style="color: red "> Delete </a> </center>
- 页面添加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'); }) })
- 可以把删除路由的响应改为返回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
相关产品推荐
相关产品推荐

