当向不存在/customers/41224d776a326fb40f000001的文档发送请求时,是并且我正在返回:_id 41224d776a326fb40f000001``doc``null``404
/customers/41224d776a326fb40f000001
_id
41224d776a326fb40f000001``doc``null``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返回一个奇怪的错误:
GET /customers/foo
CastError:路径“_id”处的值“foo”转换为 ObjectId 失败。
那么这个错误是什么?
Mongoose 的findById方法将id参数转换为模型_id字段的类型,以便它可以正确查询匹配的文档。这是一个 ObjectId,但"foo"不是有效的 ObjectId,因此转换失败。
findById
id
"foo"
这不会发生,41224d776a326fb40f000001因为该字符串是有效的 ObjectId。
41224d776a326fb40f000001
findById解决此问题的一种方法是在调用之前添加一个检查,以查看是否id是有效的 ObjectId 或不是这样:
if (id.match(/^[0-9a-fA-F]{24}$/)) { // Yes, it's a valid ObjectId, proceed with `findById` call. }