【问题标题】:Array is empty after for loopfor循环后数组为空
【发布时间】:2019-08-26 22:05:25
【问题描述】:

我在 for 循环之前设置了一个数组,在 for 循环内我使用 .push() 向数组添加数据,但在此循环之后数组为空。

MessageNotification.find({for: req.user.id}, (err, notifications) => {
    var userdata = [];
    notifications.forEach((notif) => {
        User.findById(notif.from, (err, user) => {
            userdata.push({
                id: user._id,
                username: user.username,
                thumbnail: user.thumbnail
            });
        });
    });
    console.log(userdata);
});

正如您在代码中看到的那样,我正在运行 mongoose 查询来查找特定 ID 的所有通知,然后,我正在设置一个数组来获取有关每个通知的发件人的详细信息。在 forEach 循环中,我将结果保存在数组中。第 12 行的 Console.log 返回一个空数组 [],即使第 4 行的 User.findById 获取了用户数据

【问题讨论】:

  • findById不是异步的吗?
  • 我认为它异步的,在这种情况下,您的forEach 不会在执行时填充userdata,但每次查找将在稍后完成。因此,在您运行console.log 时,信息尚未返回。
  • 它是异步的。您需要使其同步或使用承诺等。
  • 是的,但是mongoose不支持同步查询,我该怎么做?

标签: arrays node.js mongodb mongoose


【解决方案1】:

问题是您正在执行 异步 forEach 调用。在这种情况下,您应该将 async/awaitfor..ofpromises 一起使用。

在您的情况下,实际上不需要对 User 模型进行多次调用,您可以在单个查询中获得所需的结果。试试下面的代码:

MessageNotification.find({
    for: req.user.id
}, (err, notifications) => {
    const fromArr = notifications.map(({
        from
    }) => from);      // taking out **from** values from all notifications
    User.find({
        _id: {
            $in: fromArr
        }
    }, (err, users) => {        // single query to get the data
        const userData = users.map(({
            _id: id,
            username,
            thumbnail
        }) => {
           return {
              id,
              username,
              thumbnail
           };
        });
        console.log(userData);
    });
});

【讨论】:

  • 很高兴它有帮助..快乐编码:)
【解决方案2】:

这里的问题实际上是你在调用 .forEach 时内部有一个异步调用。您应该使用 $in operator 来检查数组中是否有任何值与单个查询匹配,而不是遍历数组中的每个项目,并为每个项目运行单独的查询。

【讨论】:

  • 它仍然返回一个空数组
  • 那么您的查询一定不能返回任何数据。在push 调用之后,执行console.log('userdata') 只是为了查看userdata 是否真的被填充了。
  • 我做到了,查询返回数据并且console.log在查询之前运行
  • 哪个console.log 在查询之前运行?我不确定您现在做错了什么,您必须发布代码的更新版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2021-05-24
  • 2022-06-13
  • 1970-01-01
相关资源
最近更新 更多