【问题标题】:How do I solve "CastError: Cast to ObjectId failed for value "undefined" (type string) at path "_id" for model "Task""?如何解决“CastError: Cast to ObjectId failed for value "undefined" (type string) at path "_id" for model "Task""?
【发布时间】:2022-06-14 21:38:41
【问题描述】:

我还是 Node JS 的新手。我正在尝试使用 Node JS 和 Mongo DB 创建一个书籍目录。每次我按删除按钮删除一本书时,它都会显示此错误

CastError: Cast to ObjectId failed for value "undefined" (type string) at path "_id" for model 
"Task"
BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters

这是我的server.js

app.delete("/api/books/:id", async (req, res) => {
try {
  const { id: id } = req.params;
  console.log(id);
  const task = await Task.findOneAndDelete({ _id: id });
  if (!task) {
     return res.status(404).json({ msg: `No task with id :${id}` });
  }
  res.status(200).json(task);
 } catch (error) {
  console.log(error);
 }
});

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    我也遇到过这个问题。 我收到此错误是因为通过参数传入的 ObjectId 在我的数据库中不存在。因此,这引发了异常。

    解决方法:

     //add this line as a check to validate if object id exists in the database or not
     if (!mongoose.Types.ObjectId.isValid(id)) 
                return res.status(404).json({ msg: `No task with id :${id}` });
    

    更新代码:

    app.delete("/api/books/:id", async (req, res) => {
    try {
      const { id: id } = req.params;
      console.log(id);
      if (!mongoose.Types.ObjectId.isValid(id)) 
          return res.status(404).json({ msg: `No task with id :${id}` 
      });
      const task = await Task.findOneAndDelete({ _id: id });
      res.status(200).json(task);
     } catch (error) {
      console.log(error);
     }
    });
    

    【讨论】:

    • 但是如何让我的 id 有效?
    • @Amr 你不能做任何事情来使它有效。这是 mongoDB 提供的东西,你不能对它进行任何更改,否则会出错。您可以确保如果您将 ID 存储在客户端或服务器端的变量中,请将该变量设置为 const,这样任何人都无法更改它。
    • 这是我的 ID:{ _id: new ObjectId("6236d529d4d3d7ce088769e1"), title: 'HelloWorld', image: 'm.media-amazon.com/images/I/51WApJ4MiLL.jpg', author: 'Sarah J. Maas', desc: '你好lekdlwlkelwkd', __v: 0 }
    • 您将路线称为 /api/books/6236d529d4d3d7ce088769e1 还是 /api/books/ObjectId("6236d529d4d3d7ce088769e1") ?
    • nvm... 我正在调用 /api/books/6236d529d4d3d7ce088769e1。谢谢
    【解决方案2】:

    检查以下代码是否有效!

    import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
    import mongoose from 'mongoose';
    
    @Injectable()
    export class validateObjectId {
      async isValidId(id: string) {
        if (!mongoose.Types.ObjectId.isValid(id)) {
          throw new HttpException('Not a valid ID!', HttpStatus.NOT_FOUND);
        } else {
          return id;
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 2021-04-20
      • 2017-02-06
      • 2017-03-23
      • 2020-12-10
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      相关资源
      最近更新 更多