【问题标题】:Mongoose - asynchronous call not resolving promisesMongoose - 异步调用不解决承诺
【发布时间】:2021-08-06 16:42:14
【问题描述】:

我在我正在构建的社交媒体中有这条路线,该路线遍历您关注的所有用户并获取他们的帖子。我正在使用 await 和 .exec() 但我得到的输出是一个未决的承诺。

路线:

router.get("/following", auth, async (req, res) => {
  try {
    const user = await User.findOne({ firebaseUID: req.authId });

    const posts = await user.following.map(async (usr) => {
      await Post.find({ userID: usr.user }).exec();
    });
    console.log(posts);

    res.json(posts);
  } catch (err) {
    console.error(err.message);
    res.status(500).send("Server Error");
  }
});

我从中得到的输出是[ Promise { <pending> }, Promise { <pending> } ]

我不确定为什么当我在异步函数和 .exec() 中使用 await 时,promise 没有得到解决?

【问题讨论】:

  • 您错过了对您的一系列承诺的Promise.all 调用。你不能awaitmap返回的数组。
  • 顺便说一句,你真的不应该为每个用户 ID 拨打一个 find 电话 - 一次全部获取!

标签: javascript node.js mongodb express mongoose


【解决方案1】:

这是因为您在 map 中调用了一个异步方法,而 map 不会等待 promise 得到解决,但您可以使用 for 循环代替。

  let posts = []
  for(let i=0; i<user.following.length; i++) {
    posts.push(
      await Post.find({userID: user.following[i].usr }).exec()
    );
  });
 console.log(posts);

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2016-12-06
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多