web-dev-qa-db-ja.com

非同期関数内でbcryptを使用してパスワードをハッシュしようとしています

この質問 から続きます。

私はほとんどそこにいるように感じますが、非同期についての私の不完全な理解が、これを解決することを妨げています。私は基本的に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

}
8
Modermo

await dosent wait for bcrypt.hashなぜならbcrypt.hashは約束を返しません。 bcryptを使用するには、awaitをpromiseにラップする次のメソッドを使用します。

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
}
28
Akash Dathan

デフォルトでは、bcrypt.hash(password,10)はpromiseとして返されます。 こちら を確認してください

例:コードを実行し、

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を使用すると、promiseから解決されるまで待機します。

10
umar882

Bcryptを非同期的にハッシュするには、次のようにする必要があります

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

Syncおよびasyncと混同している場合。それらについてもっと読む必要があります。良い記事がたくさんあります。

2
CodeLover

たとえば、メソッドbcrypt.hashSync()を使用します

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