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
相关产品推荐
相关产品推荐

