将猫鼬结果推入数组

时间:2018-09-27 12:55:41

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我正在尝试从“ Books.find”中获取结果,并将其推入我的Books数组中。然后,我想重新发送。

我怀疑这与某种异步和作用域垃圾有关。

有什么解决方案?

这是我目前的代码。

exports.timeline = function(req, res) {
    var Followers = mongoose.model('Follow');
    Followers.find({'follower': req.user.username}, function(err, followerResult) {
        var name = [req.user.username];
        var books = [];

        function addName(username) {
            name.push(username);
        }

        for(var user in followerResult) {
            addName(followerResult[user]['followed']);
        }

        function getDataByUsername(username) {
            function addBookArray(result) {
                books.push(result);
                return result;
            }

            var Books = mongoose.model('Book');
            Books.find({'username': username}).exec(function (err, result) {
                addBookArray(result);
            });
        }

        for(var usernames in name) {
            getDataByUsername(name[usernames]);
        }

        console.log(books);
        res.send(books);
    });
}

3 个答案:

答案 0 :(得分:0)

是的,问题是Find是异步的,您在收到结果之前先发送响应。

要处理此类问题,您有几种选择:

  • 强大的软件包Async,用于组织异步循环
  • MongoDB的aggregation,让您的数据库加入您的数据

答案 1 :(得分:0)

节点Js是异步的。您的代码永远不会等待查询结果。

以下是您可以尝试的一些选项:

承诺示例:-

Promise.all([qry1, qry2]).then(res=>{ console.log(res)  }).catch(err=>{console.log(err);})

这里qry1和qry2是您的mongo查询

答案 2 :(得分:0)

如果您不想使用async软件包,可以尝试使用mongoose和mongodb的 $ in 功能。与之类似,您将获得用户列表,然后找到其用户ID在用户列表内的书籍列表。 沿着:

exports.timeline = function(req, res) {
var Followers = mongoose.model('Follow');
Followers.find({'follower': req.user.username}, function(err, followerResult) {
    var name = [req.user.username];
    var books = [];

    function addName(username) {
        name.push(username);
    }

    for(var user in followerResult) {
        addName(followerResult[user]['followed']);
    }
    Books.find({"username" : { $in: name }}).exec(function (err, books) {
       console.log(books);
       res.send(books);
    });
});
}

希望这会有所帮助。