循环遍历mongodb文档ID数组,查询该ID并将结果存储在新数组中,得到空数组

93ze6v8z  于 2023-03-17  发布在  Go
关注(0)|答案(3)|浏览(120)

下面是我遇到问题的代码:

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文档,它具有registeredUsers字段,该字段是MongoDB对象Id的数组。当控制台记录用户时,在then块中返回,它确实显示有效的用户文档,但当循环完成后res.send(users)时,它在浏览器中显示空数组。

wz3gfoph

wz3gfoph1#

您正在尝试在forEach内执行基于承诺的代码,但该代码无法按预期方式工作。请使用for..ofPromise.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));
06odsfpq

06odsfpq2#

这是一个事件循环问题。由于User.findOne是一个Promise,因此.then()函数将在console.log(users)之后执行。
下面是一个关于JavaScript事件循环的视频:https://www.youtube.com/watch?v=8aGhZQkoFbQ

wsewodh2

wsewodh23#

const followingId = ['63d76d37b5656f8db054f989','63d8cb0e1c7b21e93a714012']
const following = await User.find({ _id: { $in: followingId } }).select(' _id first_name last_name image block_user follow_user');

followingId是一个对象ID数组,在select方法中可以传递所需的字段

相关问题