【问题标题】:Mongoose error populating virtual猫鼬错误填充虚拟
【发布时间】:2017-04-04 17:20:37
【问题描述】:

我正在使用 node 和 mongo 开发一个项目。我在本地拥有它并在服务器上“生活”以进行测试。项目的本地副本完全没有问题,但实时版本崩溃并出现错误:

/root/farm_api/node_modules/mongoose/lib/model.js:3002 throw new Error('如果你正在填充一个虚拟,你必须设置'+ ^

错误:如果要填充虚拟,则必须设置 localField 和foreignField选项 在 getModelsMapForPopulate (/root/farm_api/node_modules/mongoose/lib/model.js:3002:13) 在填充(/root/farm_api/node_modules/mongoose/lib/model.js:2647:15) 在 _populate (/root/farm_api/node_modules/mongoose/lib/model.js:2615:5) 在 Function.Model.populate (/root/farm_api/node_modules/mongoose/lib/model.js:2575:5) 在立即。 (/root/farm_api/node_modules/mongoose/lib/query.js:1276:17) 在 Immediate._onImmediate (/root/farm_api/node_modules/mongoose/node_modules/mquery/lib/utils.js:137:16) 在 processImmediate [as _immediateCallback] (timers.js:383:17)

我不知道问题是什么,我认为这与我使用 aggregate$lookup 的这个 api 调用有关 可以在这里看到:

api.dbm.Field.aggregate([
            {
                $lookup: {
                    from: 'tasks',
                    localField: '_id',
                    foreignField: 'field',
                    as: 'fieldTask'
                }
            },
            {
                $lookup: {
                    from: 'stocks',
                    localField: 'owner',
                    foreignField: 'owner',
                    as: 'stock'
                }
            }

        ], function(err, result){
            if(err) console.log(err);
            else {
                var aggregatedData = result;
                api.checkStaffRole(req.query.as, req.user._id, req.query.fid, res, function(fields, ids)
                {
                    aggregatedData.forEach(function(record, index, object){
                        if(!api.lodash.find(fields, {'_id': record._id})){
                            object.splice(index, 1);
                        } 
                    });
                    api.lodash.forEachRight(aggregatedData, function(record, index, object){
                        if(!api.lodash.find(record.staff, {'user': req.user._id})){
                            object.splice(index, 1);
                        }
                    });


                    res.json(api.buildResponse(null, aggregatedData));
                });
            }
        });

我认为这是因为在调用 api 时它们在集合中没有记录,但是为什么它在本地工作并且只有在服务器上时才会出现问题? 两台服务器都安装了 mongo 3.2,并且在 npm 中,我在两个副本上都使用了 mongoose 4.6.8(在本地使用 4.6.4 没有问题,更新了软件包并检查了仍然没有问题)。
更新:通过 npm 重新安装了 mongodb 和 mongoose,这两个版本现在都有完全相同的包(由于我在 package.json 中使用了^),但我仍然无法在本地主机上复制错误。 更改服务器上的代码以打印出结果值并显示在控制台上,以便聚合数据,然后在执行后立即崩溃

【问题讨论】:

    标签: javascript node.js mongodb express


    【解决方案1】:

    再次查看那里的所有代码并决定回滚更改,似乎我落后 mongoose 4 个更新,并且在 4.6.7 版中他们添加了

    fix(populate): 尝试时抛出更多描述性错误 填充没有正确选项的虚拟 #4602

    由于在 4.6.4 版本上,我从未满足于此,因为它给了我想要的结果我怀疑我上面的函数现在在高于 4.6.4 的版本上已经过时了。这个答案的寓意检查 package.json 确保如果这种情况或类似的事情发生在你身上,你确保你的包之前没有带有“^”的 npm 设置,因为这会在合适的更新版本可用时更新它。

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 2020-05-18
      • 2018-12-23
      • 2018-11-05
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 2015-07-13
      • 2016-10-10
      相关资源
      最近更新 更多