'BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters

Need some help here. Tried almost everything that I found at the internet, but didn't works.

So, this is my code:

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

it's happens when I'm trying to create a new blog.

this is my error :


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'
}


Solution 1:[1]

mongodb _id is an ObjectID therefore the mongoose need to look-up the Object and not the string.

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

Solution 2:[2]

Convert id to ObjectId:

import { ObjectId } from "mongodb";
const convertedId = ObjectId(id)

If conversion is not successful due to invalid id, then you can catch error:

try{
   //your code
}catch(e){
   if(e instance of BSONTypeError){
      //do whatever you need if this occurs
   }
}

Don't forget to import { BSONTypeError } from "bson";

Solution 3:[3]

Your request parameter must be a string of 12 bytes or a string of 24 hex characters Check the _id in your request params. It must be a 24 hex as this: 61d634706a98a61edd42bf45

This is just the solve your problem. That would be great if someone provides good practice about this subject.

The question is: What if the client searches with an _idnot 24 in length? Why is Mongoose throwing on error instead of just returning something like "id not found"?

Solution 4:[4]

Convert the type of id from string to mongoose objectID(default for _id).

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

Solution 5:[5]

CastError: Cast to ObjectId failed for value "blogs" ==> this means that the actual value of "const id = req.params.id.trim()" is the string "blogs" and this "blogs" is not a string of 12 bytes or a string of 24 hex characters that Blog.findById(id) is expecting.

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

try to check the value of the id then make sure you're sending the correct value from the front-end

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 bguiz
Solution 2 Iglesias Leonardo
Solution 3 Naim Gürleyük
Solution 4 BEing MECHon
Solution 5 Khalfaoui Anis