Express.js搭配Mongoose通过id更新数据时id未定义如何解决?
问题原因
你遇到的问题本质有两个:
- 访问
/update/:id时拿到的文档id没有传递到edit.ejs模板,导致提交表单时没有把id传递给后端的POST接口 - 你的POST路由
/edit没有配置id参数,自然无法从req.params中读取到id值
解决方案
步骤1:修改GET路由,将id传递给模板
app.get('/update/:id', (req, res) => { const id = req.params.id; // 将id作为参数传入edit.ejs res.render('edit.ejs', { id }); console.log(req.params.id); });
步骤2:修改edit.ejs的表单提交路径,携带id
在你的edit.ejs编辑表单的action属性中拼接拿到的id:
<form action="/edit/<%= id %>" method="POST"> <!-- 原有的年龄、性别输入框代码 --> <input type="number" name="age" required> <input type="text" name="gender" required> <button type="submit">确认修改</button> </form>
步骤3:修改POST路由,增加id参数配置
app.post('/edit/:id',(req, res) => { gymApplicant.updateOne({ _id:req.params.id }, {$set: { age: req.body.age, gender:req.body.gender } }, function (err, result) { if (err) { console.log(err); res.send('更新失败,请重试') } else { console.log("Post Updated successfully"); res.render('abc.ejs'); } }); });
可选方案:用隐藏域传id(无需修改POST路由路径)
如果你不想修改POST路由的结构,可以把id放在表单隐藏域中提交:
- edit.ejs中新增隐藏输入框:
<form action="/edit" method="POST"> <input type="hidden" name="id" value="<%= id %>"> <!-- 原有输入框代码 --> </form>
- POST路由中从body取id:
app.post('/edit',(req, res) => { gymApplicant.updateOne({ _id: req.body.id }, {$set: { age: req.body.age, gender:req.body.gender }}, 回调代码) })
内容的提问来源于stack exchange,提问作者Shubham Yadav
相关产品推荐
相关产品推荐

