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

