【问题标题】:Cast to ObjectId failed for value "req.params.id" at path "_id" for model "Project"对于模型“Project”的路径“_id”处的值“req.params.id”,转换为 ObjectId 失败
【发布时间】:2020-10-19 00:36:24
【问题描述】:

我正在尝试创建员工管理系统的克隆。 I want to implement a feature that when admin opens a details page for any project he will get list of available employees as checkboxes and when select them and submit then those employees will be added to the given project.
我正在使用 Node.js 和 MongoDB 开发它

我的项目架构是 -

const ProjectSchema = new mongoose.Schema({
  name: String,
  deadline: Date,
  description: String,
  manager:{
    id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
  },
  employees: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        }
    ],
  created_on: { 
    type: Date, 
    default: Date.now
  }

});

表格-

<form action="/admin/project/<%= project._id %>/addmembers" method="POST">
  <div class="row">
    <% employees.forEach((employee) => { %>
      <% if(!employee.projects.includes(project._id)){ %>
      <div class="col-12 col-sm-6 col-md-4 col-xl-3">
        <input type="checkbox" value="<%= employee._id %>" name="newMembers"> <%= employee.name %> </input>
      </div>
      <% } %>
    <% }); %>
  </div>
<hr class="my-2">
<p class="lead">
  <button class="btn btn-blue btn-lg">Add Members</button>
</p>
</form>

处理请求的代码 -

router.post("/project/:id/addmembers", (req, res) => {
  console.log("add member post route");
  Project.findById(req.params.id, (err, foundProject) => {
    if(err){
      console.log(err);
      req.flash("error", err.message);
      res.redirect("back");
    } else {
      req.body.newMembers.forEach((employee) => {
        foundProject.employees.push(employee);
      })
      
      foundProject.save()
      console.log(foundProject);
      req.flash("success", "Successfully added new members");
      res.redirect("/admin/project/req.params.id");
    }
  })
});

现在,每当我提交表单时,都会添加用户,但我总是收到错误 Cast to ObjectId failed for value "req.params.id" at path "_id" for model "Project" 而不是 success message 现在我是 mongo 的新手,所以我用谷歌搜索它但无法解决我的问题,谁能解释我为什么会出现这个错误即将到来,我该如何解决?

我还知道,如果只选中一个复选框,那么 req.body.newMembers 将不是数组。如果您能提供更好的方法来做到这一点,那将非常有帮助?

更新 -
我也尝试了findOne()find()findByIdAndUpdate()id = mongoose.Types.ObjectId(req.params.id),但仍然收到相同的错误消息

【问题讨论】:

    标签: node.js mongodb mongoose-schema


    【解决方案1】:

    看起来正在发生的事情是您没有正确处理 id 和 _id。鉴于您没有提及任何内容,我假设您只看到一次此错误。但是,鉴于错误与项目模型/模式有关,并且您对 manageremployees 使用几乎相同的代码,该错误应该与两者之间的差异有关。我看到的主要区别是经理有id: {*id stuff*},但员工有{*id stuff*},没有id:。但是,我不认为这是实际的错误,而只是要记住的事情。也可以尝试将 id 类型更改为 number 之类的,看看这是否与问题有关。

    我认为 实际错误 是因为您在 findById() 中使用了 req.params.id。这将使用 _id 搜索您的数据库。首先,同时拥有 id 和 _id 有点多余(如果你有理由,那很好,但 _id 是 MongoDB 需要的东西,所以最好坚持使用它,因为它是预先创建和处理的)。其次,您使用 string/int 作为 id 搜索。要测试这是否是问题所在,请尝试将findById() 更改为findOne()find()。澄清一下,findById() 并不明确需要 ObjectId,因此类型可能不是问题,但findById() 处理搜索的方式与find({_id: id}) 不同。

    要检查的另一件事是req.params.id 实际上给出了正确的值。它应该,但这是需要验证的。为此,只需console.log() 即可。如果这是问题所在,请尝试将 :id 移动到路径的末尾。

    回应您的修改: 确保问题与员工中没有 id: 无关(如上所述),并且与 id 是 ObjectId 而不是数字无关。如果您将id 更改为数字,请确保更改搜索,以便通过id 而不是_id 找到对象。只是让您知道,每个 MongoDB 对象都有一个 _id(甚至是像员工和经理这样的子对象),所以使用 id 有点多余。

    为您提供更多尝试:确保您console.log() req.params.id 以确保它具有正确的值。然后,还可以尝试注释代码部分,直到找到它所在的行。尝试对一些输入进行硬编码,直到它起作用为止。

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 2019-06-26
      • 2020-05-11
      • 2023-03-28
      • 2017-05-23
      • 2018-07-10
      • 2020-11-19
      • 2021-07-04
      • 2017-08-18
      相关资源
      最近更新 更多