この質問 から続きます。
私はほとんどそこにいるように感じますが、非同期についての私の不完全な理解が、これを解決することを妨げています。私は基本的に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
}
await
dosent wait forbcrypt.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
}
デフォルトでは、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から解決されるまで待機します。
Bcryptを非同期的にハッシュするには、次のようにする必要があります
bcrypt.hash(password, saltRounds, function(err, hash) {
if (err) {
throw err;
}
// Do whatever you like with the hash
});
Syncおよびasyncと混同している場合。それらについてもっと読む必要があります。良い記事がたくさんあります。
たとえば、メソッドbcrypt.hashSync()を使用します
const encrypt = async (password) => {
const hashed = await bcrypt.hashSync(password,saltRounds)
return hashed
}