【问题标题】:BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex charactersBSONTypeError: 传入的参数必须是 12 个字节的字符串或 24 个十六进制字符的字符串
【发布时间】:2021-12-01 20:00:50
【问题描述】:

在这里需要一些帮助。 尝试了我在互联网上找到的几乎所有东西,但没有奏效。

所以,这是我的代码:

    const id = req.params.id.trim(); 
    Blog.findById(id)
        .then((result) => {
            res.render("details", { blog: result, title: "Blog Details" });
        })
        .catch((err) => {
            console.log(err);
        });
};

当我尝试创建一个新博客时会发生这种情况。

这是我的错误:


CastError: Cast to ObjectId failed for value "blogs" (type string) at path "_id" for model "Blog"
    at model.Query.exec (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/query.js:4546:21)
    at model.Query.Query.then (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/query.js:4645:15)
    at blog_details (/Users/xxx/blogMongoDB/controllers/blogController.js:19:10)
    at Layer.handle [as handle_request] (/Users/xxx/blogMongoDB/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/xxx/blogMongoDB/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/xxx/blogMongoDB/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/xxx/blogMongoDB/node_modules/express/lib/router/layer.js:95:5)
    at /Users/xxx/blogMongoDB/node_modules/express/lib/router/index.js:281:22
    at param (/Users/xxx/blogMongoDB/node_modules/express/lib/router/index.js:354:14)
    at param (/Users/xxx/blogMongoDB/node_modules/express/lib/router/index.js:365:14) {
  messageFormat: undefined,
  stringValue: '"blogs"',
  kind: 'ObjectId',
  value: 'blogs',
  path: '_id',
  reason: BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters
      at new BSONTypeError (/Users/xxx/blogMongoDB/node_modules/bson/lib/error.js:41:28)
      at new ObjectId (/Users/xxx/blogMongoDB/node_modules/bson/lib/objectid.js:65:23)
      at castObjectId (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/cast/objectid.js:25:12)
      at ObjectId.cast (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/schema/objectid.js:245:12)
      at ObjectId.SchemaType.applySetters (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/schematype.js:1135:12)
      at ObjectId.SchemaType._castForQuery (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/schematype.js:1567:15)
      at ObjectId.SchemaType.castForQuery (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/schematype.js:1557:15)
      at ObjectId.SchemaType.castForQueryWrapper (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/schematype.js:1534:20)
      at cast (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/cast.js:336:32)
      at model.Query.Query.cast (/Users/xxx/blogMongoDB/node_modules/mongoose/lib/query.js:4969:12),
  valueType: 'string'
}

【问题讨论】:

  • 如果你 console.log req.params.id 你得到什么价值?

标签: javascript node.js mongodb objectid


【解决方案1】:

你的请求参数must be a string of 12 bytes or a string of 24 hex characters 检查您的请求参数中的_id。它必须是 24 位十六进制数:61d634706a98a61edd42bf45

这只是解决您的问题。如果有人提供有关此主题的良好实践,那就太好了。

问题是:如果客户端搜索的长度为_idnot 24 怎么办?为什么 Mongoose 会抛出错误而不是仅仅返回“id not found”之类的东西?

【讨论】:

    【解决方案2】:

    将id的类型从string转换为mongoose objectID(默认为_id)。

    const id = mongoose.Types.ObjectId(req.params.id.trim());
    

    【讨论】:

      【解决方案3】:

      CastError: Cast to ObjectId failed for value "blogs" ==> 这意味着 "const id = req.params.id.trim()" 的实际值是字符串 "blogs" 而这个 "blogs" 是不是 Blog.findById(id) 期望的 12 个字节的字符串或 24 个十六进制字符的字符串。

      https://mongoosejs.com/docs/schematypes.html#objectids

      尝试检查 id 的值,然后确保从前端发送正确的值

      【讨论】:

        猜你喜欢
        • 2023-02-09
        • 2022-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多