在 bcrypt 上承诺 { <pending> }

Promise { <pending> } on bcrypt

我正在尝试使用 bcryptjs 验证用户密码。我有这个 returns 一个 Promise 的函数,但是当我到达 bycrypt.hash 时,我得到的只是 Promise { <pending> } 因此 .then() 不会在未定义的情况下执行。请帮忙,我已经被困在这个问题上一段时间了

userSchema.methods.verifyPassword = function (password, err, next) {
  const saltSecret = this.saltSecret;
  const a = async function(resolve, reject) {
    console.log('hi4')
    console.log('this.saltSecret2', saltSecret);
    console.log(password);

    const hashed_pass = await bcrypt.hash(password, saltSecret);
    console.log('hash', hashed_pass);
    const valid = await bcrypt.compare(password, hashed_pass);
    if(valid){
      console.log('GOOD');
    }
  };
  a();
};

bcrypt.hash 使用回调,而不是承诺(这就是 .then 所做的)

你应该像这样使用它:

bcrypt.hash(password, this.saltSecret, (err, hash) => {
    ...
});

这一行总是return一个承诺。

console.log(bcrypt.hash(password, this.saltSecret));

你总是可以做这样的事情。

return new Promise(async (resolve, reject) => {
    const hash = await bcrypt.hash(password, this.saltSecret);

    if (hash == this.password) {
        return resolve(true);
    }

    return reject();
});

我喜欢使用异步等待语法来处理承诺。它不那么混乱。并提供快速理解其他人代码的能力。

您可以将您的函数设为异步函数。等到 bcrypt 完成它的工作

const password = await bcrypt.hash(password, saltSecret);

然而 bcrypt 库提供了一个函数来比较密码和哈希值

const valid = await bcrypt.compare(password, hashed_pass);

试试这个

async function(resolve, reject) {
  console.log('hi4')
  console.log(this.saltSecret);
  console.log(password);

  const hashed_pass = await bcrypt.hash(password, saltSecret);
  console.log('hash', hashed_pass);
  const valid = await bcrypt.compare(password, hashed_pass);
  if(valid){
    console.log('GOOD');
  }
};