цикл по массиву идентификаторов документов mongodb и запрос этого идентификатора и сохранение результата в новом массиве дает пустой массив - PullRequest
0 голосов
/ 29 февраля 2020

Ниже приведен код, с которым у меня возникают проблемы:

    const users = []
    event.registeredUsers.forEach(userId => {
            User.findOne({ _id: userId }).then(user => {
                console.log(user) // logs a valid user
                users.push(user)
            });
        });

    console.log(users) // logs empty array

Событие - это документ MongoDB, в котором имеется поле registerUsers, которое является массивом идентификаторов объектов MongoDB. Когда консольная регистрация пользователя, возвращенного в блоке then, показывает действительный документ пользователя, но когда res.send (users) после завершения l oop показывает пустой массив в браузере.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Вы пытаетесь выполнить код на основе обещаний внутри forEach, который работает не так, как вы ожидаете. Используйте for..of или Promise.all

for..of (последовательно)

const users = []
for(const userId of event.registeredUsers) {
    User.findOne({ _id: userId }).then(user => {
       console.log(user) // logs a valid user
       users.push(user)
     });
 }

console.log(users) 

Promise.all (параллельно)

Promise.all(event.registeredUsers.map(userId => {
    return User.findOne({ _id: userId }).then(user => {
       console.log(user) // logs a valid user
       return user;
     });
 }).then(users => console.log(users));

0 голосов
/ 29 февраля 2020

Это событие l oop проблема. Поскольку User.findOne является Promise , функция .then() будет выполняться ПОСЛЕ console.log(users).

Вот хорошее видео о JavaScript циклах событий: https://www.youtube.com/watch?v=8aGhZQkoFbQ

...