节点js等待循环完成

Node js wait for loop to finish

我正在尝试 return 某个用户喜欢的事件列表,但是代码 return 数组似乎总是空的(return 在我的之前执行for循环)。

router.route("/app/mylikes").get(async function(req, res, next) {
  var mylikes = [];

  const likes = await Like.find();

  likes.forEach(element => {
    bcrypt.compare(req.user.device_uuid, element.device_uuid, function(
      err,
      isMatch
    ) {
      if (isMatch) {
        mylikes.push(element.event_id);
      }
    });
  });
  res.send(mylikes);
});

用户的 uuid 在 table 中进行了哈希处理,所以我先使用 bcrypt 进行比较,然后将其添加到我的 "mylikes" 数组中。

在 Promises/await/async 方面,我仍然是个菜鸟,因此非常感谢您的帮助。

您正在使用 bcrypt.compare 的回调系统,但是当您省略回调参数时,还有一个 promise interface for it

for (let element of likes) {
   let isMatch = await bcrypt.compare(req.user.device_uuid, element.device_uuid);
   if (isMatch) {
      mylikes.push(element.event_id);
   }
}

确保使用 is compatible with your version of Node.

的 bcrypt 版本

如果由于某种原因你不能移动到 bcrypt 3(我会问 "why?"),那么你可以按如下方式承诺 compare 方法的非承诺版本:

let comparePromise = (str, hash) => 
    new Promise((resolve, reject) =>
        bcrypt.compare(str, hash, (err, isMatch) =>
            err ? reject(err) : resolve(isMatch)
        )
    );

然后:

for (let element of likes) {
   let isMatch = await comparePromise(req.user.device_uuid, element.device_uuid);
   if (isMatch) {
      mylikes.push(element.event_id);
   }
}

请注意,您不能在其回调中使用 .forEachawait,因为那样不会停止 forEach 迭代挂起。这就是我使用 for...of 循环的原因。