尝试在异步函数中使用bcrypt散列密码

时间:2018-02-15 04:20:02

标签: javascript node.js mongoose bcrypt

继续this question

我觉得我几乎就在那里,但我对异步的不完全理解阻止了我解决这个问题。我基本上试图使用bcrypt来散列密码并决定分离hashPassword函数,以便我可以在应用程序的其他部分使用它。

hashedPassword一直未定义返回...

userSchema.pre('save', async function (next) {

  let user = this
  const password = user.password;

  const hashedPassword = await hashPassword(user);
  user.password = hashedPassword

  next()

})

async function hashPassword (user) {

  const password = user.password
  const saltRounds = 10;

  const hashedPassword = await bcrypt.hash(password, saltRounds, function(err, hash) {

    if (err) {
      return err;
    }

    return hash

  });

  return hashedPassword

}

6 个答案:

答案 0 :(得分:17)

  

await等待bcrypt.hash,因为bcrypt.hash没有   回报承诺。使用以下方法将bcrypt包装在一个承诺中,以便使用await

async function hashPassword (user) {

  const password = user.password
  const saltRounds = 10;

  const hashedPassword = await new Promise((resolve, reject) => {
    bcrypt.hash(password, saltRounds, function(err, hash) {
      if (err) reject(err)
      resolve(hash)
    });
  })

  return hashedPassword
}

答案 1 :(得分:8)

默认情况下,bcrypt.hash(password,10)将按承诺返回。请检查here

示例:运行代码,

var bcrypt= require('bcrypt');

let password = "12345";


var hashPassword = async function(){
    console.log(bcrypt.hash(password,10));
    var hashPwd = await bcrypt.hash(password,10);
    console.log(hashPwd);
}

hashPassword();

输出:

Promise { <pending> }
$2b$10$8Y5Oj329TeEh8weYpJA6EOE39AA/BXVFOEUn1YOFC.sf1chUi4H8i

当您在异步函数中使用await时,它将等待直到从诺言中解决。

答案 2 :(得分:2)

异步散列bcrypt应该是这样的

bcrypt.hash(password, saltRounds, function(err, hash) {
  if (err) {
     throw err;
  }
  // Do whatever you like with the hash
});

如果您对同步和异步感到困惑。您需要阅读更多有关它们的信息。 那里有很多好文章。

答案 3 :(得分:1)

您需要在文档中查看here

接受回调的异步方法,回调时返回Promise 如果有Promise支持,则不指定。

因此,如果您的函数调用接受了回调,则不能在其上使用await,因为此函数签名不会返回Promise。为了使用await,您需要删除回调函数。您还可以将其包装在Promiseawait上,但这有点矫kill过正,因为该库已经提供了这样做的机制。

代码重构:

try {
   // I removed the callbackFn argument
   const hashedPassword = await bcrypt.hash(password, saltRounds)
} catch (e) {
   console.log(e)
}

答案 4 :(得分:0)

例如使用方法bcrypt.hashSync()

const encrypt = async (password) => {
     const hashed = await bcrypt.hashSync(password,saltRounds)
     return hashed
}

答案 5 :(得分:0)

const hashedPassword = (password, salt) => {
    return new Promise((resolve, reject) => {
        bcrpyt.hash(password, salt, (err, hash) => {
            if (err) reject();
            resolve(hash);
        });
    });
};
hashedPassword('password', 10).then((passwordHash) => {
    console.log(passwordHash);
});