如何“打破”;在异步功能中工作?

时间:2019-07-11 01:07:30

标签: javascript node.js

我在登录过程中使用了pbkdf2-password模块,其中一些代码在运行时似乎卡住了。我使用了异步哈希函数来验证用户,并且当用户输入错误的密码时会发生问题。只是加载不会停止。

我尝试重定向并在用户输入错误的passwd并返回时返回。 但我想知道为什么休息不起作用。

app.post('/login', (req, res) => {
  console.log(req.body);
  let userid = req.body.id;
  let password = req.body.password;
  console.log('userid = ', userid);
  console.log('password = ', password);
  console.log('userlist = ', sampleUserList);
  let bFound = false;

  for (let i = 0; i < sampleUserList.length; i++) {
    let user = sampleUserList[i];
    console.log(sampleUserList[i]);
    if (userid === user.userid) {
      console.log('[found] userid = ', userid);
      bFound = true;
      /* here's where I verify users. */
      return hasher({
        password: password,
        salt: user.salt
      }, function(err, pass, salt, hash) {
        if (err) {
          console.log('ERR : ', err);

        }

        if (hash === user.password) {
          console.log('INFO : ', userid, ' logged in successfully')

          req.session.user = sampleUserList[i];
          req.session.save(function() {
            res.redirect('/carlist');
          })
          return;
          /* here's the code for when users input wrong passwd but still have ID */
        } else {
          console.log('Wrong passwd.');
        }
      });
    }
    if (bFound) break;
  }

  if (!bFound) {
    console.log('Theres no such ID.');
  }
  res.redirect('/login_form');
});

else {
  console.log('Wrong passwd.');
  res.redirect('/login_form');
  return;
}

此代码解决了问题,但是我想知道为什么中断不起作用。

no error msg but infinite loading.

1 个答案:

答案 0 :(得分:2)

将永远无法到达break。 if语句中的return将阻止所有后续代码执行。

它也打破了循环,因此您可以随意删除break,因为您的函数已经完成了break想要的工作。

app.post('/login', (req, res) => {
  let userid = req.body.id;
  let password = req.body.password;
  let bFound = false;

  for (let i = 0; i < sampleUserList.length; i++) {
    let user = sampleUserList[i];
    if (userid === user.userid) {
      bFound = true;
      return hasher(/* args */); // <-- this ends execution of the login handler
    }
    if (bFound) break;
  }

  if (!bFound) {
    console.log('Theres no such ID.');
  }
  res.redirect('/login_form');
});