【问题标题】:Error: cyclic dependency detected with Mongo + Nodejs Project错误:使用 Mongo + Nodejs 项目检测到循环依赖项
【发布时间】:2018-04-25 20:58:23
【问题描述】:

美好的一天:

我目前正在开发一个 NodeJs + MongoDB 项目。我的解决方案很简单,我有 3 个集合(Client、Scope、Grant)。 Scope 在 Client 和 Grant 集合之间形成了多对多的关系。目前我正在查询一个 Client 记录,然后获取分配给该 Client 的所有 Scope 集合,最后,获取所有 Grant 记录在我之前查询的 Scope 集合中。这是我的代码:

getClient (clientId, clientSecret, callback) {
 let that = this;
 this.mongoClient.collection('client').findOne({"client" : clientId, "client_secret" : clientSecret}, function (err, client) {
     if (err) {
         return callback(err, null);
     } 
     that.mongoClient.collection('scope').find({'client_id': client._id}, {"service_id":1}, function(err, serviceIds) {
         that.mongoClient.collection('grant').find({'_id': { $exists : true, $in : serviceIds }}, function(err, grants) { 
             console.log(grants.toArray());
             callback(err, client);
         })
     });


 });
}

当我运行我的代码时,我得到了这个:

Promise {


 <rejected> Error: cyclic dependency detected
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:296:33)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at serializeObject (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:308:18)
    at serializeInto (/home/vagrant/api/node_modules/bson/lib/bson/parser/serializer.js:776:17)
    at BSON.serialize (/home/vagrant/api/node_modules/bson/lib/bson/bson.js:58:27)
    at Query.toBin (/home/vagrant/api/node_modules/mongodb-core/lib/connection/commands.js:140:25)
    at Pool.write (/home/vagrant/api/node_modules/mongodb-core/lib/connection/pool.js:986:23)
    at Cursor._find (/home/vagrant/api/node_modules/mongodb-core/lib/cursor.js:286:22)
    at nextFunction (/home/vagrant/api/node_modules/mongodb-core/lib/cursor.js:591:10)
    at Cursor.next [as _next] (/home/vagrant/api/node_modules/mongodb-core/lib/cursor.js:699:3)
    at fetchDocs (/home/vagrant/api/node_modules/mongodb/lib/cursor.js:857:10)
    at toArray (/home/vagrant/api/node_modules/mongodb/lib/cursor.js:884:3)
    at /home/vagrant/api/node_modules/mongodb/lib/cursor.js:841:5
    at Promise (<anonymous>)
    at Cursor.toArray (/home/vagrant/api/node_modules/mongodb/lib/cursor.js:840:10)
    at /home/vagrant/api/services/TokenService.js:20:25 }

有趣的是,我发现这是导致问题的代码,但是我不知道为什么console.log(grants.toArray());

【问题讨论】:

  • 绝对不确定,但是否 serviceIds 是一个游标,而 $in 需要一个值数组?

标签: node.js mongodb


【解决方案1】:

在 mongoose 连接中,将 autoIndex 设置为 false,如下所示:

    mongoose.connect('mongodb://localhost:27017/gscoo', {autoIndex: false});

【讨论】:

    【解决方案2】:

    我认为这个问题与 clientId 和 clientSecret 的类型有关。例如,它们可以是对象,而预期是变量。如果它们是对象,则应将它们转换为变量。 否则,请务必检查 clientId 和 clientSecret 中是否没有任何字符会产生解析问题。

    【讨论】:

      【解决方案3】:

      您可以删除 MongoDB 连接字符串末尾的选项。

      【讨论】:

      • 您能解释一下为什么这可能有助于解决他们的问题吗?
      • 我不知道为什么,但这解决了我从 mLab 迁移到 Atlas 后的问题。
      【解决方案4】:

      我不小心在 $set 操作中插入了一个集合,然后导致了这个错误。

      由于错误中没有有用的堆栈跟踪,我不得不调试一下,直到找到失败的操作。

      因此,您的 $set 操作可能格式不正确,例如由于交换了参数的函数调用中断。

      在找到真正原因之前,我考虑升级 bson。但是最新的 bson 包只包含在 mongodb 4.0 中,目前处于测试阶段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-02
        • 2021-01-23
        • 2020-05-09
        • 2020-11-18
        • 2020-03-14
        • 2012-05-25
        相关资源
        最近更新 更多