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
}
await
dosent attendrebcrypt.hash
carbcrypt.hash
ne renvoie pas de promesse. Utilisez la méthode suivante, qui enveloppebcrypt
dans une promesse afin d'utiliserawait
.
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
}
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.
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.
utiliser la méthode bcrypt.hashSync () par exemple
const encrypt = async (password) => {
const hashed = await bcrypt.hashSync(password,saltRounds)
return hashed
}