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

Node.js TODO Web应用:如何将HBS页面删除任务数据传回Server.js

解决TODO应用的删除任务数据回传问题

我来帮你搞定这个删除功能的问题,其实你离成功只差几步啦!针对你遇到的“如何把用户选中的任务传回server.js”的问题,我给你两种可行的解决方案,适配你现有的代码结构:

1. 用表单提交实现删除(最直接的方案)

你现在的表单已经有雏形,但缺少关键的属性让服务器能拿到数据,修改起来很简单:

修改HBS页面的表单代码

<form id="delete" method="POST" action="/deleteTask">
  <select id="chooseDelete" name="taskId" form="delete">
    <option> Choose task to delete</option>
    {{#each todos}}
    <!-- 这里把value设为任务的唯一标识,推荐用数据库的_id,比自增的missionNumber更可靠 -->
    <option value="{{element._id}}">{{missionNumber}} - {{text}}</option>
    {{/each}}
  </select>
  <input value="Delete" type="submit">
</form>

关键修改点:

  • 给<select>加了name="taskId":这是服务器获取提交值的“钥匙”,没有它表单提交时不会传递选中值
  • 给<option>的value设为数据库的_id:你之前用的missionNumber是遍历数组生成的,删除任务后编号会混乱,用数据库原生的唯一ID更稳妥
  • 指定表单的method="POST"和action="/deleteTask":告诉浏览器把数据提交到服务器的这个路由

在server.js中添加处理删除的路由

首先要先配置Express的表单解析中间件(不然拿不到POST请求的表单数据),在app = express()之后加上:

// 解析表单提交的数据
app.use(express.urlencoded({ extended: true }));

然后添加处理删除请求的POST路由:

app.post('/deleteTask', (req, res) => {
  // 获取用户选中的任务ID
  const taskId = req.body.taskId;
  
  // 用你的Todo模型执行删除操作
  Todo.findByIdAndDelete(taskId)
    .then(() => {
      // 删除成功后重定向回任务列表页面
      res.redirect('/allTasks');
    })
    .catch(err => {
      console.error('删除任务失败:', err);
      res.redirect('/allTasks');
    });
});

2. 用AJAX实现无刷新删除(对应你尝试的按钮点击方式)

如果不想刷新页面就完成删除,可以用Fetch API发送异步请求,修改你的前端代码如下:

<p id="demo"></p>
<select id="chooseDelete">
  <option> Choose task to delete</option>
  {{#each todos}}
  <option value="{{element._id}}">{{missionNumber}} - {{text}}</option>
  {{/each}}
</select>
<button id="deleteButton">Delete</button>

<script>
const deleteButton = document.getElementById('deleteButton');
deleteButton.addEventListener("click", function(){
  const selectedTaskId = document.getElementById("chooseDelete").value;
  
  // 先判断用户有没有选任务
  if (!selectedTaskId || selectedTaskId === "Choose task to delete") {
    document.getElementById("demo").innerHTML = "请先选择要删除的任务!";
    return;
  }

  // 发送异步请求到服务器
  fetch('/deleteTask', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: `taskId=${selectedTaskId}`
  })
  .then(response => {
    if (response.ok) {
      document.getElementById("demo").innerHTML = "任务删除成功!";
      // 可选:这里可以不刷新页面,直接移除页面上对应的任务元素
      // 简单方式:刷新页面更新任务列表
      setTimeout(() => window.location.reload(), 1000);
    } else {
      document.getElementById("demo").innerHTML = "删除失败,请重试!";
    }
  })
  .catch(err => {
    console.error('请求出错:', err);
    document.getElementById("demo").innerHTML = "请求出错了!";
  });
});
</script>

服务器端的/deleteTask路由和上面的完全一样,不需要额外修改,这样就能实现无刷新删除了。

你可以根据自己的需求选其中一种方式,测试的时候记得看服务器控制台,确认能拿到正确的任务ID哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:06:58