问题描述
当向 /customers/41224d776a326fb40f000001
发送请求并且带有 _id
的文档 41224d776a326fb40f000001
不存在时,doc
是 null
并且我返回一个 404
:
When sending a request to /customers/41224d776a326fb40f000001
and a document with _id
41224d776a326fb40f000001
does not exist, doc
is null
and I'm returning a 404
:
Controller.prototype.show = function(id, res) {
this.model.findById(id, function(err, doc) {
if (err) {
throw err;
}
if (!doc) {
res.send(404);
}
return res.send(doc);
});
};
但是,当 _id
与 Mongoose 期望的格式"(我想)不匹配时,例如 GET/customers/foo
会返回一个奇怪的错误:
However, when _id
does not match what Mongoose expects as "format" (I suppose) for example with GET /customers/foo
a strange error is returned:
CastError: Cast to ObjectId 因路径_id"处的值foo"而失败.
这是什么错误?
推荐答案
Mongoose 的 findById
方法将 id
参数转换为模型的 _id
类型code> 字段,以便它可以正确查询匹配的文档.这是一个 ObjectId 但 "foo"
不是一个有效的 ObjectId,因此转换失败.
Mongoose's findById
method casts the id
parameter to the type of the model's _id
field so that it can properly query for the matching doc. This is an ObjectId but "foo"
is not a valid ObjectId so the cast fails.
41224d776a326fb40f000001
不会发生这种情况,因为该字符串是有效的 ObjectId.
This doesn't happen with 41224d776a326fb40f000001
because that string is a valid ObjectId.
解决此问题的一种方法是在您的 findById
调用之前添加检查以查看 id
是否是有效的 ObjectId 或不是这样的:
One way to resolve this is to add a check prior to your findById
call to see if id
is a valid ObjectId or not like so:
if (id.match(/^[0-9a-fA-F]{24}$/)) {
// Yes, it's a valid ObjectId, proceed with `findById` call.
}
这篇关于对于路径“_id"处的值 XXX,Mongoose 错误 Cast to ObjectId 失败是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!