Массив пуст в ответе даже после добавления в него элементов

#javascript #node.js #arrays #twitter

Вопрос:

Я создаю внутренние API-интерфейсы для клона Twitter. Приведенный ниже API показывает профиль пользователя. Я хочу показать твиты людей, за которыми следит этот пользователь. Но в моем ответе массив твитов возвращает пустой массив, хотя я поместил данные в этот массив.

Кто-нибудь может помочь мне понять, почему массив твитов пуст в ответе?

 app.get('/api/profile', auth, function (req, res) {


    var email1 = req.user.email;
    var followers_data = [];
    var tweets = [];

    follower.find({ emailoffollowee: email1 }, (err, results) => {
        if (err)
            console.log(err);
        else {
            results.map((d, k) => {
                followers_data.push(d.emailoffollower);
            })
            for (var i = 0; i < followers_data.length; i  ) {
                Tweet.find({ author: followers_data[i] }, (err, results1) => {
                    if (err)
                        console.log(err);
                    else {
                        results1.map((d, k) => {
                            tweets.push(d);
                        })
                    }
                })
            }
            res.json({
                isAuth: true,
                id: req.user._id,
                email: req.user.email,
                name: req.user.firstname   req.user.lastname,
                followers: followers_data,
                tweet: tweets

            });
        }
    })
        .catch(error => {
            console.log(error);
        })
});```
 

Комментарии:

1. Ты имеешь дело с обещаниями.. которые являются асинхронными. Сначала изучите это, а затем, пожалуйста, правильно отформатируйте свой код.

Ответ №1:

У вас есть Tweet.find() асинхронная функция, для решения проблемы, которую я использовал async/await

 app.get('/api/profile', auth, function (req, res) {


var email1 = req.user.email;
var followers_data = [];
var tweets = [];

follower.find({ emailoffollowee: email1 }, async (err, results) => {
    if (err)
        console.log(err);
    else {
        results.map((d, k) => {
            followers_data.push(d.emailoffollower);
        })
        for (var i = 0; i < followers_data.length; i  ) {
          let results1 = await Tweet.find({ author: followers_data[i] });
                results1.map((d, k) => {
                    tweets.push(d);
                })
        }
        res.json({
            isAuth: true,
            id: req.user._id,
            email: req.user.email,
            name: req.user.firstname   req.user.lastname,
            followers: followers_data,
            tweet: tweets

        });
    }
})
    .catch(error => {
        console.log(error);
    })
});
 

Я рекомендую вам прочитать эту статью async/await