Перенос результатов Mongoose в массив - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь получить результаты из моего "Books.find" и вставить их в массив моих книг.Затем я хочу отправить его повторно.

Я подозреваю, что это как-то связано с асинхронным мусором и мусором в области видимости.

Какое решение?

Это в настоящее времямой код.

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 голосов
/ 27 сентября 2018

Узел Js является асинхронным.Ваш код никогда не ждет результата вашего запроса.

Ниже приведены некоторые варианты, которые вы можете попробовать:

Пример обещания: -

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

здесь qry1 и qry2 - ваш запрос монго

0 голосов
/ 27 сентября 2018

Если вы не хотите работать с пакетом async , вы можете попробовать поработать с $ in функциональностью mongoose и mongodb.Например, вы получаете список пользователей, а затем находите список книг, для которых идентификатор пользователя находится внутри списка пользователей.Что-то вроде:

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

Надеюсь, это поможет.

0 голосов
/ 27 сентября 2018

Вы правы, проблема в том, что Find является асинхронным, и вы отправляете свой ответ до того, как получите результат.

Для решения подобных проблем у вас есть несколько вариантов:

  • Мощный пакет Async для организации ваших асинхронных циклов
  • Агрегирование MongoDB, позволяющее вашей БД присоединяться к вашим данным
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...