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

Express POST路由无法接收PostgreSQL返回的id与section变量,待办列表删除功能失效

Express POST路由无法接收PostgreSQL返回的id与section变量,待办列表删除功能失效

看起来你遇到的问题大概率是数据库查询时没把id和section字段取出来,导致EJS里根本拿不到这两个值,自然提交给后台的时候是空的。我帮你一步步排查:

1. 先检查Express中的数据库查询语句

你在渲染index.ejs的时候,肯定有一段从PostgreSQL查询tasks的代码,比如类似这样的结构:

// 错误示例:只查了task_description和color,没包含id和section
app.get("/", (req, res) => {
  db.query("SELECT task_description, color FROM tasks", (err, result) => {
    if (err) throw err;
    res.render("index", { tasks: result.rows });
  });
});

如果是上面这种写法,result.rows里的每个task对象就只有task_description和color两个属性,EJS里的task.id和task.section自然是undefined,输出到表单的value里就是空字符串,后台req.body.deleteTaskId当然也是空的。

解决方法:把查询语句改成包含所有需要的字段:

// 正确示例:明确指定要查询的所有字段
app.get("/", (req, res) => {
  db.query("SELECT id, task_description, color, section FROM tasks", (err, result) => {
    if (err) throw err;
    // 这里可以先打印看看每个task的结构,确认有id和section
    console.log("查询到的tasks:", result.rows);
    res.render("index", { tasks: result.rows });
  });
});

调试阶段也可以用SELECT * FROM tasks快速确认,但生产环境建议明确指定字段,避免不必要的性能开销。

2. 确认数据库中section字段确实有值

你说section是“每次添加同一个字符串”,那要检查INSERT语句有没有给section赋值,比如:

// 错误示例:INSERT时没给section字段赋值,导致数据库中该字段为NULL
db.query(
  "INSERT INTO tasks (task_description, color) VALUES ($1, $2)",
  [taskDesc, taskColor],
  (err) => {
    if (err) throw err;
    res.redirect("/");
  }
);

// 正确示例:INSERT时给section赋值
db.query(
  "INSERT INTO tasks (task_description, color, section) VALUES ($1, $2, $3)",
  [taskDesc, taskColor, "默认分组"], // 替换成你要的固定字符串
  (err) => {
    if (err) throw err;
    res.redirect("/");
  }
);

如果数据库中section是NULL,那查询出来的task.section就是null,EJS里输出的话就是空字符串,提交给后台也是空的。

3. 验证EJS中的task对象结构

可以在EJS里临时加一段调试代码,看看每个task的具体内容:

<% for (let task of tasks)  {%>
  <!-- 临时调试:在页面上输出task的JSON结构,确认有没有id和section -->
  <div style="display: none;"><%= JSON.stringify(task) %></div>                                         
  <form action="/delete" method="post">
    <input type="submit" id="trashImg" name="deleteTaskId" value="<%= task.id %>">
  </form>
<% } %>

然后打开浏览器的页面源码,看看这段隐藏的div里的JSON内容,如果里面没有id和section字段,那肯定是查询语句的问题。

4. 关于id的类型问题

PostgreSQL的SERIAL是整数类型,查询出来的id是数字,EJS里输出到input的value会自动转成字符串,后台拿到req.body.deleteTaskId后,用parseInt(req.body.deleteTaskId)就能转成整数——前提是这个值不是空的。如果是空的,parseInt就会返回NaN,这和你遇到的情况完全一致。

另外你提到section和id一样传不过来,原因也是相同的:要么查询时没包含这个字段,要么数据库里没有值。

试试上面的步骤,应该能解决问题。如果还是不行,你可以把Express里查询和渲染EJS的那段代码贴出来,我再帮你细化排查~

备注:内容来源于stack exchange,提问作者Jessie Moore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 20:13:02