我觉得我几乎就在那里,但我对异步的不完全理解阻止了我解决这个问题。我基本上试图使用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
}
答案 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
,您需要删除回调函数。您还可以将其包装在Promise
和await
上,但这有点矫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);
});