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

MongoDB+Express+Handlebars环境下DELETE请求实现问题求助

问题分析与解决

你的删除功能触发不了DELETE请求,核心是这几个问题导致的,逐个修正即可:

1. a标签无法直接发送DELETE请求

浏览器默认只会给<a>标签发送GET请求,你加的data-method="delete"只是自定义属性,浏览器不会识别执行。要实现DELETE请求,有两种实用方案:

方案一:用表单模拟DELETE请求

把删除链接换成表单,配合Express的method-override中间件实现(需先安装依赖):

<h1>{{rev.title}}</h1>
<h2>{{rev.snippet}}</h2>
<p>{{rev.body}}</p>

<form action="/reviews/{{this.id}}" method="POST" style="display: inline;">
  <input type="hidden" name="_method" value="DELETE">
  <button type="submit" class="rem">Delete</button>
</form>

然后在Express入口文件中配置中间件:

// 先执行安装命令:npm install method-override
const methodOverride = require('method-override');
app.use(methodOverride('_method'));

方案二:用JavaScript发送AJAX请求

保留a标签,添加点击事件监听,通过fetch发送DELETE请求:

<h1>{{rev.title}}</h1>
<h2>{{rev.snippet}}</h2>
<p>{{rev.body}}</p>

<a class="rem" data-id="{{this.id}}" href="javascript:void(0)">Delete</a>

<script>
document.querySelector('.rem').addEventListener('click', async function() {
  const id = this.dataset.id;
  try {
    await fetch(`/reviews/${id}`, {
      method: 'DELETE'
    });
    window.location.href = '/reviews'; // 请求成功后跳转列表页
  } catch (err) {
    console.error(err);
  }
});
</script>

2. 控制器中ID获取错误

你的路由定义是/:id,所以控制器里应该取req.params.id,而非req.params._id,修正后代码:

const review_delete = (req, res) => {
  const id = req.params.id; // 此处将_id改为id
  mySchemas.reviews.findByIdAndRemove(id, function(err) {
    if(err) {
      res.send(err);
    } else {
      res.redirect("/reviews"); // 改用绝对路径,避免跳转路径出错
    }
  });
}

3. 可选优化:改用现代异步写法

findByIdAndRemove是MongoDB的旧版方法,推荐使用findByIdAndDelete,同时换成async/await写法更易维护:

const review_delete = async (req, res) => {
  try {
    const id = req.params.id;
    await mySchemas.reviews.findByIdAndDelete(id);
    res.redirect("/reviews");
  } catch (err) {
    res.status(500).send(err);
  }
}

完成以上修改后,删除功能就能正常触发DELETE请求,删除文档后自动跳转到评论列表页。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:50:46