使用mongoose+express+nodejs删除MongoDB列表项功能异常咨询
故障原因
核心问题是原有代码未校验删除结果,仅通过是否有报错判断删除成功,而mongoose查找不到对应ID的文档时不会抛出错误,所以会出现「打印成功但实际未删除」的情况。同时常见的触发原因还有ID未正确传递、请求体未解析两类情况。
修复步骤
- 补全删除接口的逻辑校验,替换原有
/delete路由代码:
app.post('/delete', (req, res) => { // DELETE CHECKED ITEM ON list.ejs FORM USING ITS _id const checkedItemId = req.body.checkbox; console.log('待删除ID:', checkedItemId); // 校验ID合法性 if (!checkedItemId || !mongoose.isValidObjectId(checkedItemId)) { console.log('ID无效,跳过删除'); return res.redirect('/'); } Item.findByIdAndRemove(checkedItemId, (err, deletedItem) => { if (err) { console.log('删除报错:', err); return res.redirect('/'); } // 校验是否真的找到了条目删除 if (!deletedItem) { console.log('未找到对应ID的条目,无数据被删除'); return res.redirect('/'); } console.log('Successfully deleted checked item:', deletedItem); res.redirect('/'); }); });
- 确认app.js中已配置请求体解析中间件,该配置需要放在所有路由定义之前:
app.use(express.urlencoded({ extended: true }));
- 检查
list.ejs模板中checkbox的配置,确保value正确绑定了条目_id,表单提交属性正确:
<form action="/delete" method="POST"> <% items.forEach(function(item){ %> <div class="item"> <input type="checkbox" name="checkbox" value="<%=item._id%>" onchange="this.form.submit()"> <p><%= item.name %></p> </div> <% }) %> </form>
修改后重启服务即可正常删除条目。
内容的提问来源于stack exchange,提问作者Chris Faux
相关产品推荐
相关产品推荐

