我正在使用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中使用^
)而我仍然无法在本地主机上复制错误
在服务器上更改代码以打印出结果值并将其显示在控制台上,以便聚合数据然后在执行后立即崩溃
答案 0 :(得分:2)
再次回到那里的所有代码并决定回滚更改似乎我是mongoose背后的4个更新,并且在4.6.7版本中他们添加了
fix(populate):尝试时抛出更多描述性错误 填充没有适当选项的虚拟#4602
由于版本4.6.4,我从未照顾过这个,因为它给了我想要的结果我怀疑上面的函数现在已经过时了4.6.4以上的版本。这个答案的道德检查package.json确保如果你或你这样或类似的事情确保你没有使用" ^"在您的软件包之前,这将在适当的更新版本可用时更新它。