我有图像模型和用户模型。 每个图像都有一个用户的user_id字段,我想获取用户和名称的图片,将其添加到图像对象并返回图像数组。
当我尝试将author_image字段添加到ONE图像时,我没有任何错误, 但当我循环所有图像时,应用程序崩溃输出的是imagesData未定义以及userData。 我尝试使用promises,但我再次收到错误。 没有未定义的错误,我能做到的最好方法是什么?
router.route('/images/all')
.get(function(req,res){
var response = {};
var imagesData = {};
images.find({}).lean().exec(function(err,data){
// console.log(data);
imagesData = data;
if (!err) {
for (var i = 0; i < imagesData.length; i++) {
users.find(({'_id': imagesData[i].user_id}),function(err,userData){
console.log(userData);
imagesData[i].author_pic = userData[0].profile_image;
});
}
}
res.json(imagesData);
});
});
答案 0 :(得分:1)
您错过的是find
操作不是同步操作。因此,您的所有find
操作都会立即转到下一行。
虽然有多种方法可以处理这种情况,但我倾向于使用promises(Q library)。
代码看起来像这样
var Q = require('q');
var defer = Q.defer();
images.find({}).lean().exec(function (err, data) {
// console.log(data);
imagesData = data;
var promiseArr = [];
if (!err) {
for (var i = 0; i < imagesData.length; i++) {
var innerDefer = Q.defer();
users.find(({'_id': imagesData[i].user_id}), function (err, userData) {
console.log(userData);
defer.resolve(userData[0].profile_image);
});
promiseArr.push(innerDefer);
}
}
Q.all(promiseArr).then(function (results) {
for (var i = 0; i < imagesData.length; i++) {
if (Q.isPromise(results[i])) {
results[i] = results[i].valueOf();
}
imagesData[i].author_pic = results[i];
}
res.json(imagesData);
})
});
在这种情况下,我使用Q.all
方法基本上等待所有find
完成,然后才执行。