仅在循环(其中包含函数)完成后才如何运行语句?

时间:2020-08-09 18:29:24

标签: javascript node.js

这是我的代码。

router.route("/login").post((req, res) => {
  const email = req.body.email;
  const password = req.body.password;
  Account.find().then((account) => {
    account.forEach((eachAcc) => {
      if (eachAcc.email.toUpperCase() === email.toUpperCase()) {
        bcrypt.compare(password, eachAcc.password, function (err, result) {
          if (result == true) res.status(200).json("Login Successful");
          else if (err) res.status(400).json("Error: " + err);
        });
      }
    });
    res.status(400).json("Invalid email or password");
  });
});

但是我总是收到无效的电子邮件/密码,我希望仅在循环完成且电子邮件/密码不匹配时才打印。

请帮助。

3 个答案:

答案 0 :(得分:1)

尝试一下

    router.route("/login").post((req, res) => {
      const { email, password } = req.body;
      Account.find().then((account) => {
      let acc = account.find(
         (eachAcc) => eachAcc.email.toUpperCase() === 
            email.toUpperCase()
         );
      if (acc) {
         bcrypt.compare(password, acc.password, function (err, result) 
          {
            if (err) res.status(400).json("Error: " + err);
            else if (result) res.status(200).json("Login Successful");
            else res.status(400).json("Invalid password");
          });
         } else res.status(400).json("Invalid email");
       });
    });

答案 1 :(得分:0)

您可以将setTimeout函数用于此setTimeout(()=> {//代码在此处},300)。

答案 2 :(得分:0)

我希望这会有所帮助:

router.route("/login").post((req, res) => {
  const { email, password } = req.body;

  Account.find().then((accounts) => {
    let match = false;
    for (acct of accounts) {
      if (acct.email.toUpperCase() !== email.toUpperCase()) continue;

      bcrypt.compare(password, acct.password, (err, result) => {
        if (err) {
          res.status(400).json("Error: " + err);
          break;
        }
        res.status(200).json("Login Successful");
        match = true;
        break;
      });

    }
    if (!match) res.status(400).json("Invalid email or password");
  });
});