![](/img/trans.png)
[英]With async the bcrypt.hash function returns undefined but it works fine with .then
[英]Trying to hash a password using bcrypt inside an async function
从这个问题开始。
我觉得我快到了,但我对异步的不完整理解阻止了我解决这个问题。 我基本上只是尝试使用 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 等待bcrypt.hash
因为bcrypt.hash
不返回承诺。 使用以下方法,它将bcrypt
包装在一个 promise 中以便使用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
}
更新:-
该库添加了代码来返回一个 promise,这将使
async/await
的使用成为可能,这在之前是不可用的。 新的使用方式如下。
const hashedPassword = await bcrypt.hash(password, saltRounds)
默认情况下, bcrypt.hash(password,10)
将作为承诺返回。 请检查这里
示例:运行代码,
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
当您在 async 函数中使用await
,它会一直等到它从 promise 中得到解决。
使用方法 bcrypt.hashSync(),它是同步开箱即用的。
const hashedPassword = bcrypt.hashSync(password,saltRounds);
异步散列 bcrypt 应该是这样的
bcrypt.hash(password, saltRounds, function(err, hash) {
if (err) {
throw err;
}
// Do whatever you like with the hash
});
如果您对同步和异步感到困惑。 你需要阅读更多关于它们的信息。 那里有很多好文章。
您需要在文档中查看此处。
如果 Promise 支持可用,则接受回调的异步方法在未指定回调时返回 Promise。
因此,如果您的函数调用接受回调,则不能对其使用await
,因为此函数签名不返回Promise
。 为了使用await
您需要删除回调函数。 您也可以将它包装在Promise
并await
它,但这有点矫枉过正,因为库已经提供了一种机制来这样做。
代码重构:
try {
// I removed the callbackFn argument
const hashedPassword = await bcrypt.hash(password, saltRounds)
} catch (e) {
console.log(e)
}
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);
});
有同样的问题...通过从函数分配布尔值来解决:
compareHash = (password, hashedPassword) => {
if (!password || !hashedPassword) {
return Promise.resolve(false);
}
return bcrypt.compare(password, hashedPassword);
};
这里的 2 个参数不会是未定义的,这是问题的原因。 并调用函数:
let hashCompare = this.compareHash(model.password, entity.password);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.