web-dev-qa-db-fra.com

Essayer de hacher un mot de passe en utilisant bcrypt dans une fonction asynchrone

Suite à cette question .

Je sens que j'y suis presque, mais ma compréhension incomplète de l'async m'empêche de résoudre ce problème. J'essaie simplement de hacher un mot de passe en utilisant bcrypt et j'ai décidé de séparer la fonction hashPassword afin de pouvoir l'utiliser potentiellement dans d'autres parties de l'application.

hashedPassword continue de renvoyer undefined bien que ...

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 attendre bcrypt.hash car bcrypt.hash ne renvoie pas de promesse. Utilisez la méthode suivante, qui enveloppe bcrypt dans une promesse afin d'utiliser 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
}
28
Akash Dathan

Par défaut, bcrypt.hash(password,10) reviendra comme promis. veuillez vérifier ici

Exemple: Exécutez le code,

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();

Sortie:

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

Lorsque vous utilisez await à l'intérieur de la fonction asynchrone, il attendra jusqu'à ce qu'il soit résolu à partir de la promesse.

10
umar882

Le hachage de bcrypt de manière asynchrone devrait ressembler à ceci

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

Si vous êtes confondu avec sync et async. Vous devez en savoir plus à leur sujet. Il y a beaucoup de bons articles.

2
CodeLover

utiliser la méthode bcrypt.hashSync () par exemple

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