【问题标题】:Mongoose two request depending each other猫鼬两个请求相互依赖
【发布时间】:2017-03-01 13:16:56
【问题描述】:

我有图像模型和用户模型。 每个图像都有一个用户的 user_id 字段,我想获取用户的图片和名称,将其添加到图像对象并返回图像数组。

当我尝试将 author_image 字段添加到一个图像时,我没有任何错误, 但是,当我遍历所有图像时,应用程序崩溃的输出是 imagesData 以及 userData 未定义。 我尝试使用 Promise,但再次出现错误。 在没有未定义错误的情况下,我能做到这一点的最佳方法是什么?

    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);

 });

});

【问题讨论】:

    标签: node.js mongodb rest


    【解决方案1】:

    您错过的是find 操作不是同步操作。所以你所有的find 操作立即转到下一行。

    虽然有多种方法可以处理这种情况,但我倾向于使用 Promise (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 完成,然后才执行。

    【讨论】:

    • 我试图理解这一点,我把它放在代码中,我得到的 author_pic 值为:"author_pic":{"promise":{}}
    • 只需在Q.all内的循环内设置一个条件并从promise if (Q.isPromise(result[i])) { results[i] = results[i].valueOf(); } 中提取值
    • 谢谢,帮了大忙
    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 2011-04-26
    • 2018-09-24
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多