填充虚拟

时间:2016-11-21 10:33:41

标签: javascript node.js mongodb express

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

  
    

/root/farm_api/node_modules/mongoose/lib/model.js:3002           抛出新错误('如果要填充虚拟,则必须设置'+           ^

  
     

错误:如果要填充虚拟,则必须设置localField   和foreignField选项       at getModelsMapForPopulate(/root/farm_api/node_modules/mongoose/lib/model.js:3002:13)       在populate(/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)       at 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中使用^)而我仍然无法在本地主机上复制错误 在服务器上更改代码以打印出结果值并将其显示在控制台上,以便聚合数据然后在执行后立即崩溃

1 个答案:

答案 0 :(得分:2)

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

  

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

由于版本4.6.4,我从未照顾过这个,因为它给了我想要的结果我怀疑上面的函数现在已经过时了4.6.4以上的版本。这个答案的道德检查package.json确保如果你或你这样或类似的事情确保你没有使用" ^"在您的软件包之前,这将在适当的更新版本可用时更新它。