【发布时间】: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