在这里需要一些帮助。 尝试了我在互联网上找到的几乎所有内容,但没有奏效。
所以,这是我的代码:
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'
}
您的请求参数must be a string of 12 bytes or a string of 24 hex characters
检查请求参数中的_id
。它必须是一个 24 十六进制数,例如:61d634706a98a61edd42bf45
这可能会解决您的问题。如果有人能提供有关此主题的更多信息,那就太好了。
问题是:如果客户端搜索长度不是 24 的_id
怎么办?为什么猫鼬抛出错误而不是只返回"未找到id"之类的内容?
将id 的类型从字符串转换为猫鼬对象 ID(默认值为 _id)。
const id = mongoose.Types.ObjectId(req.params.id.trim());
mongodb _id
是一个ObjectID
因此猫鼬需要查找对象而不是字符串。
不错的解决方案:const id = mongoose.Types.ObjectId(req.params.id.trim());
您的处理程序app.get('/blogs/create')
需要高于您的处理程序app.post('/blogs/:id')
。
==>,Cast to ObjectId 失败,这意味着"const id = req.params.id.trim()"的实际值是字符串"blogs",而这个"blogs"不是Blog.findById(id)期望的12个字节的字符串或24个十六进制字符的字符串。
https://mongoosejs.com/docs/schematypes.html#objectids
尝试检查 ID 的值,然后确保从前端发送正确的值
将id
转换为ObjectId
:
import { ObjectId } from "mongodb";
const convertedId = ObjectId(id)
如果转换由于无效id
而未成功,则可以捕获错误:
try{
//your code
}catch(e){
if(e instance of BSONTypeError){
//do whatever you need if this occurs
}
}
别忘了import { BSONTypeError } from "bson";
就我而言..
当我应该添加一个字符串时,我正在添加一个对象。
const id = req.params
这段代码给了我一个对象,所以我必须在该对象中选择 ID。
const id = req.params.streamId;
如果仍然不起作用,则在最后添加.toString()
我建议删除节点和mongoDB并尝试再次安装,如果您尝试了所有方法并且没有任何工作,请重新安装monogdb和node.its工作至少从我这里开始,请确保在删除所有文档之前备份文档,祝您好运
将id 的类型从字符串转换为猫鼬对象 ID(默认值为 _id)。
const id = mongoose.Types.ObjectId(req.params.id.trim());
您无法将普通字符串转换为 ObjectId,请在使用前检查param.id
。
您可以使用ObjectId.isValid("YOUR ID STRING")
进行测试。