Mongoose两个请求相互依赖

时间:2016-10-19 18:38:36

标签: node.js mongodb rest

我有图像模型和用户模型。 每个图像都有一个用户的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);

 });

});

1 个答案:

答案 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完成,然后才执行。