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

Node.js/Express/Mongoose待办App删除功能传递_id为空的问题

问题解决:待办项删除功能中item._id传递为空的问题

核心问题分析

  1. item._id传递为空:Mongoose文档的_id是ObjectId对象,直接在EJS模板中使用<%= item._id %>时,可能因隐式转换异常导致渲染后的value为空字符串。
  2. 异步操作顺序错误:后端deleteOne是异步操作,未等待其完成就执行数据查询与页面重定向,会导致页面刷新后无法及时看到删除效果。

修复步骤

1. 修正EJS模板的_id传递

显式调用toString()方法将ObjectId转换为字符串,确保复选框能正确获取到待办项ID:

<form class="delete-form" action="/delete" method="POST">
    <div class="todobox">
        <input name="checkbox" value="<%= item._id.toString() %>" type="checkbox" onchange="this.form.submit()">
        <p>
            <%= item.context %>
        </p>
    </div>
</form>

2. 修复后端异步逻辑

使用await等待删除操作完成,保证数据查询基于最新的数据库状态:

app.post("/delete", async(req, res) => {
    const checkedItem = req.body.checkbox;
    console.log(checkedItem);
    
    // 等待删除操作完成
    try {
        await todolist.deleteOne({_id: checkedItem});
        console.log(`Item (${checkedItem}) was deleted.`);
    } catch (err) {
        console.log(err);
    }
    
    // 删除完成后查询最新数据
    items = await todolist.find({}, { _id: 0, context: 1 });
    console.log(`now the to-do-list has ${items.length} items.`);
    res.redirect("/");
});

3. 可选:添加参数合法性校验

避免无效ID或空值导致的数据库错误,增强代码健壮性:

const mongoose = require('mongoose');

app.post("/delete", async(req, res) => {
    const checkedItem = req.body.checkbox;
    
    // 校验ID格式与存在性
    if (!checkedItem || !mongoose.Types.ObjectId.isValid(checkedItem)) {
        console.log("Invalid or missing item ID");
        return res.redirect("/");
    }
    
    console.log(checkedItem);
    try {
        await todolist.deleteOne({_id: checkedItem});
        console.log(`Item (${checkedItem}) was deleted.`);
    } catch (err) {
        console.log(err);
    }
    
    items = await todolist.find({}, { _id: 0, context: 1 });
    console.log(`now the to-do-list has ${items.length} items.`);
    res.redirect("/");
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:34:54