CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败
Posted
技术标签:
【中文标题】CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败【英文标题】:CastError: Cast to ObjectId failed for value ":id" at path "_id" for model 【发布时间】:2021-07-04 11:59:05 【问题描述】:前言:我对使用 mongoose/express 比较陌生。
我正在尝试制作一个应用程序,其中一个名为“Space”的猫鼬模式中有一个名为“posts”的数组。数组的内容是 ObjectId 对另一个名为“Post”的 mongoose Schema 的引用。但是,每次我向应该发回我的空间和其中的帖子的路线发出 GET 请求时,我都会收到一个令人讨厌的错误。另外,我的帖子没有填充我的空间。
错误:CastError: Cast to ObjectId failed for value "undefined" at path "_id" for model "Space"
这是我的路线:
获取
app.get('/spaces/:id', (req,res) =>
Space.findById(req.params.id).populate('posts').exec((err, space) =>
if(err)
console.log(err);
else
res.send(space);
);
);
发布
app.post('/spaces/:id/posts', (req,res) =>
Space.findById(req.params.id, (err, space) =>
if(err)
console.log(err);
res.redirect('/spaces/:id');
else
Post.create(req.body, (err, newPost) =>
if(err)
console.log(err);
else
newPost.save();
space.posts.push(newPost._id);
res.redirect('/spaces/:id');
);
);
);
这是我的架构:
发布架构:
const mongoose = require('mongoose');
让 postSchema = new mongoose.Schema( 标题:字符串, 描述:字符串 );
module.exports = mongoose.model("Post", postSchema);
空间架构:
const mongoose = require('mongoose');
让 spaceSchema = new mongoose.Schema( 标题:字符串, 描述:字符串, 帖子:[ 类型:mongoose.Schema.Types.ObjectId, 参考:“发布” ] );
module.exports = mongoose.model('Space', spaceSchema);
【问题讨论】:
在调用findById方法console.log(mongoose.isValidObjectId(req.params.id))
之前检查req.params.id
是否是一个有效的ObjecId
嗨!我刚试了一下,我得到了“真实”。
看起来req.params.id
未定义。做一个 console.log(req.params.id)
我收到了 req.params.id 的字符串。好像已经定义好了。
【参考方案1】:
由 MongoDB 提供的 ObjectID。它是 bsonType ID,它是用于在集合中存储文档的唯一 id。
CastError: Cast to ObjectId failed for value “:id” at path “_id” for model
当我们收到此类错误时,这意味着您发送的 ObjectId 无效,因此您需要先使用 regex 或 mongoose inbuild 函数检查它
const mongoose = require('mongoose');
const ObjectId = mongoose.Types.ObjectId;
let orderId = null
try
orderId = ObjectId(req.query.orderId)
catch (InvalidObjectIdException)
// send invalid orderId
另外,您可以通过正则表达式检查let checkForValidMongoDbID = new RegExp("^[0-9a-fA-F]24$");
。
ObjectId 应在继续请求之前进行验证。
function isValidObjectID(parameter, name)
let checkForValidMongoDbID = new RegExp("^[0-9a-fA-F]24$");
return checkForValidMongoDbID.test(parameter)
// your controller
app.post('/spaces/:id/posts', (req, res) =>
if (isValidObjectID(req.params.id) === false)
res.send("Please provide correct object id")
return
Space.findById(req.params.id, (err, space) =>
if (err)
console.log(err);
res.redirect('/spaces/:id');
else
Post.create(req.body, (err, newPost) =>
if (err)
console.log(err);
else
newPost.save();
space.posts.push(newPost._id);
res.redirect('/spaces/:id');
);
);
);
// http://localhost:8080/spaces/324234/post ==> invalid
// http://localhost:8080/spaces/61056c908cca27df3db2e4c9/post ==> valid
【讨论】:
对代码没有任何评论的代码答案不被认为是一个好的答案,请详细说明代码块中发生的情况。【参考方案2】:我也遇到了类似的错误,参数中的 id 错误
正确的id:
products/updateproductbyid/60fp5f46196351c7e381c0085
错误的 ID:
products/updateproductbyid/660fp5f46196351c7e381c0085
代码:
await productsModel.findByIdAndUpdate(
_id: _id ,
newProduct,
(err, result) =>
if (err)
res.send(err);
else
res.send("changed!");
错误:
CastError: 模型“products”的路径“_id”处值“ _id: '660fp5f46196351c7e381c0085'”(类型对象)的值转换为 ObjectId 失败
【讨论】:
以上是关于CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败的主要内容,如果未能解决你的问题,请参考以下文章
CastError:模型“Company”的路径“_id”处的值“...”转换为 ObjectId 失败
CastError:对于猫鼬中模型的路径“_id”处的值“findByName”,转换为 ObjectId 失败
CastError:对于猫鼬中模型的路径“_id”处的值“findByName”,转换为 ObjectId 失败
Mongoose:CastError:对于模型“”的路径“_id”处的值“”,转换为 ObjectId 失败
CastError:模型“用户”的路径“_id”处的值“未定义”转换为 ObjectId 失败
NestJS 和 MongoDB | CastError:模型“Player”的路径“_id”处的值“1”转换为 ObjectId 失败