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

Express.js搭配Mongoose通过id更新数据时id未定义如何解决?

问题原因

你遇到的问题本质有两个:

  1. 访问/update/:id时拿到的文档id没有传递到edit.ejs模板,导致提交表单时没有把id传递给后端的POST接口
  2. 你的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放在表单隐藏域中提交:

  1. edit.ejs中新增隐藏输入框:
<form action="/edit" method="POST">
  <input type="hidden" name="id" value="<%= id %>">
  <!-- 原有输入框代码 -->
</form>
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:06:03