客户端更新MongoDB数据库时QuizID返回undefined问题排查
编辑测验后QuizID返回undefined的问题修复
问题根源
- POST路由ID获取方式错误:
/completeEdit路由没有定义:id路径参数,你用req.params.id必然拿到undefined——表单的ID是通过hidden字段提交的,应该从req.body.id获取。 - EJS中ID字段可能不匹配:MongoDB文档默认主键是
_id,虽然Mongoose会生成虚拟id属性,但直接用quiz._id更稳妥。 - 表单标签未闭合:EJS代码里的
<form标签最后缺少闭合符号,会导致表单提交异常。
修改后的代码
app.js POST路由部分
app.post("/completeEdit", async function (req, res) { // 从表单提交的body中获取ID const quizId = req.body.id; const editedQuestion = req.body.editQuestion; const editedAnswer = req.body.editAnswer; console.log(editedQuestion, editedAnswer, quizId) try { const updatedResult = await Quiz.findByIdAndUpdate( quizId, { question: editedQuestion, answer: editedAnswer }, { new: true } ); if (updatedResult) { console.log("Quiz updated:", updatedResult); res.redirect('/'); } else { console.log("Quiz not found.", quizId); res.redirect('/'); } } catch (error) { console.log(error); res.redirect('/'); } });
编辑页EJS代码
<h1>Make An Edit</h1> <form action="/completeEdit" method="post"> <div class="edit-window-content"> <label>Question</label> <input class="question-edit-box" type="text" name="editQuestion" placeholder="Edit question" value="<%= quiz.question %>"> <label>Answer</label> <textarea class="answer-edit-box" name="editAnswer" rows="4" cols="30" placeholder="Edit answer"><%= quiz.answer %></textarea> <!-- 使用MongoDB原生的_id字段 --> <input type="hidden" name="id" value="<%= quiz._id %>"> <button class="overlay-close" type="submit" name="button">Done</button> </div> </form> <!-- 修复闭合标签 -->
额外优化点
- 去掉了嵌套的
updateDocument函数,直接在路由处理函数中使用async/await,逻辑更清晰,避免潜在的回调问题。 - 新增了
quizId的日志输出,方便调试时确认ID是否正确传递。
内容的提问来源于stack exchange,提问作者TeDi
相关产品推荐
相关产品推荐

