mongodb - 什么是 Mongoose 错误 Cast to ObjectId failed for value XXX at path "_id"?

标签 mongodb mongoose

当向 /customers/41224d776a326fb40f000001 发送请求并且带有 _id 41224d776a326fb40f000001 的文档不存在时,docnull 并且我返回一个 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 会返回一个奇怪的错误:

CastError: Cast to ObjectId failed for value "foo" at path "_id".

那么这个错误是什么?

最佳答案

Mongoose 的 findById 方法将 id 参数转换为模型的 _id 字段的类型,以便它可以正确查询匹配的文档。这是一个 ObjectId,但 "foo" 不是有效的 ObjectId,因此转换失败。

41224d776a326fb40f000001 不会发生这种情况,因为该字符串是有效的 ObjectId。

解决此问题的一种方法是在 findById 调用之前添加一个检查,以查看 id 是否是有效的 ObjectId:

if (id.match(/^[0-9a-fA-F]{24}$/)) {
  // Yes, it's a valid ObjectId, proceed with `findById` call.
}

关于mongodb - 什么是 Mongoose 错误 Cast to ObjectId failed for value XXX at path "_id"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14940660/

相关文章:

mongodb - Laravel 关闭 mysql/mongodb 连接

node.js - 无法访问 Mongoose 响应的对象属性

javascript - 不理解 Mongoose 模型?

MongoDB 使用另一个集合中的另一个字段更新字段

node.js - 如何用 Mongoose 只保存日期部分,而不是 ISODate 格式

database - 用golang动态查询mongodb

javascript - Meteor 发布/订阅延迟时间

node.js - Mongoose 不为多个字段创建文本索引

node.js - Mongoose - 按字符串查询嵌套文档

node.js - MapReduce 确定分类账中的信用余额