当前位置: 首页 > 知识库问答 >
问题:

Mongoose:CastError:path“\u id”处的值“[object object]”转换为ObjectId失败

饶元章
2023-03-14

我不熟悉node。js,所以我有一种感觉,这将是我忽略的愚蠢的事情,但我还没有找到解决我问题的答案。我要做的是创建一个路径,该路径将创建一个新的子对象,将其添加到父对象的子对象数组中,然后将子对象返回给请求者。我遇到的问题是,如果我将字符串id传递给findById,节点就会崩溃

对象{}没有方法cast

如果我试图传递一个对象,我会得到

CastError: Cast to ObjectId失败的值"[对象对象]"在路径"_id"

下面是我的代码的大致轮廓:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId

mongoose.connect('mongodb://user:password@server:port/database');

app.get('/myClass/:Id/childClass/create', function(request, result) {
  var id = new ObjectId(request.params.Id);
  MyClass.findById(id).exec( function(err, myClass) {
    if (err || !myClass) { result.send("error: " + err + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
    var child = ChildClass();
    myClass.Children.addToSet(child);
    myClass.save();
    result.send(child);
  });
});

如果我使用路径“/myClass/51c35e5ced18cb901d000001/childClass/create”执行此代码,这是代码的输出:

错误: CastError: Cast to ObjectId for value"[对象对象]"at path"_id"{"path":"51c35e5ced18cb901d000001","实例":"ObjectID","验证器":[],"setters":[],"getters":[],"_index": null}

我尝试使用findOne并传入{_id: id},但这似乎正是findById所做的。我已经尝试了其他网站上列出的不同的ObjectId类。我尝试调用ObjectId()像一个函数,而不是一个构造函数,并返回未定义。在这一点上,我已经没有什么想法了,用谷歌搜索答案似乎也没什么帮助。知道我做错了什么吗?

另外,正如我所说,我是node/Mongo/Mongoose/Express的新手,所以如果有更好的方法来实现我的目标,请告诉我。我感谢所有的反馈。

编辑:

在解决了Peter Lyons的问题后,我在谷歌上搜索到了另一个我遇到的错误,找到了findByIdAndUpdate,它按预期工作,完全符合我的期望。我仍然不确定findById和findOne为什么会给我这样的问题,我很想知道(可能需要提交一份bug报告),所以我会把这个打开,以防其他人有答案。

共有3个答案

戚云
2023-03-14

对于所有那些坚持这个问题,但仍然无法解决它的人:我偶然发现了同样的错误,发现_id字段是空的。

我在这里更详细地描述了它。仍然没有找到一个解决方案,除了改变中的字段_id到非ID字段,这是一个肮脏的黑客给我。我可能要为猫鼬提交一份错误报告。任何帮助将不胜感激!

编辑:我更新了我的线程。我提交了一张罚单,他们确认了丢失的_id问题。它将在4. x. x版本中修复,该版本现在有一个发布版本。不建议将rc用于生产用途!

颛孙钱青
2023-03-14

我遇到了这个错误,那是因为你要过滤的值在_id字段不是在一个ID格式,一个"如果"应该解决你的错误。

const mongoose = require('mongoose');

console.log(mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943'));
// true
console.log(mongoose.Types.ObjectId.isValid('whatever'));
// false

要解决此问题,请始终验证搜索的标准值是否是有效的ObjectId

const criteria = {};
criteria.$or = [];

if(params.q) {
  if(mongoose.Types.ObjectId.isValid(params.id)) {
    criteria.$or.push({ _id: params.q })
  }
  criteria.$or.push({ name: { $regex: params.q, $options: 'i' }})
  criteria.$or.push({ email: { $regex: params.q, $options: 'i' }})
  criteria.$or.push({ password: { $regex: params.q, $options: 'i' }})
}

return UserModule.find(criteria).exec(() => {
  // do stuff
})
陆文博
2023-03-14

简短回答:使用猫鼬。类型。目标。

Mongoose(但不是mongo)可以接受对象ID作为字符串,并为您正确地“转换”它们,所以只需使用:

MyClass.findById(req.params.id)

但是,警告是ifreq。params。id不是mongo id字符串的有效格式,它将引发您必须捕获的异常。

所以最让人困惑的是猫鼬。SchemaTypes中包含了您仅在定义mongoose模式时使用的内容,mongoose。类型具有创建要存储在数据库或查询对象中的数据对象时使用的内容。所以猫鼬。类型。ObjectId(“51bb793aca2ab77a3200000d”)有效,将为您提供一个可以存储在数据库中或在查询中使用的对象,如果提供了无效的ID字符串,将引发异常。

findOne获取一个查询对象并将单个模型实例传递给回调函数。而findById实际上是findOne({{u id:id})的包装器(参见这里的源代码)。Justfind获取一个查询对象,并将匹配模型实例的数组传递给回调函数。

慢慢来。这很令人困惑,但我可以向你保证,在这一点上,你会感到困惑,不会碰到猫鼬的虫子。这是一个相当成熟的图书馆,但需要一些时间来掌握它的窍门。

我在您的代码片段中看到的另一个可疑之处是在实例化ChildClass时没有使用new。除此之外,您还需要发布您的模式代码,以便我们帮助您消除任何遗留的错误。

 类似资料:
  • 我正在尝试用mongodb和nodejs制作一个应用程序。我做了一个特殊的路由,它有参数,并且运行良好。 我还做了另一个get路线,它有。每次我收到该错误时向该路由发送请求时: 我的路线是: 当我向上面的路由发出get请求时,我得到了该错误: 我的产品模型是: 我怎样才能解决这个问题?

  • 我正在用node/express/mongo/mongoose构建一个应用程序。我遇到了一个我似乎无法理解的错误,谷歌搜索到目前为止没有任何帮助。 我创建了一个简单的、以猫为主题的示例来重现我遇到的错误。我基本上是通过ObjectId检索一个对象。我正在使用创建对象时自动生成的对象id(作为字符串)。 当我导航到路径localhost:3000/kitty/586d62878fc14d30e0ac

  • 好吧,我看到这里有一些这样的帖子,但他们没有帮助我。。。 让我描述一下我的问题: 我有两个模式 现在我已经有了一个B对象,我想创建一个a对象。 所以我这样做: b对象是从我的monogDB加载的。调试器为我的b显示了一个有效的ObjectId(53627ed535d9d04416e26218或Sb~Õ5ÙÐDáb)。 但是,当我保存新的A-Object时,会出现错误:“CastError:Cast

  • 我正在开发一个节点应用程序。在我添加之前,所有的路线似乎都在运行 当我注释掉id路由时,新路由按预期工作。但是当它在那里的时候,我试着在: 我得到以下错误: (节点:17216)未经处理的PromisejectionWarning:CastError:在模型“Client”的路径“\u id”处对值“new”进行转换到ObjectId失败 这是我的模式: 我似乎找不到这里的问题,任何帮助都将不胜感

  • 我的应用程序可以在本地工作,但在生产中,我似乎无法使用猫鼬从mongo获取特定的东西。我尝试过:

  • 我试图在一个MEAN堆栈应用程序中处理一个计划。当我调用findOne时,我得到了这个错误: 我就是这样做的: 我注意到,当我把id作为一个字符串(如下所示)时,一切正常。 所以,我控制台: 我一直在尝试我在这里找到的东西,但任何东西都可以帮助我解决这个问题:/