我希望创建一个简单的帮助函数,它使用bcrypt
返回给定密码的哈希值,但每次调用该函数时,它都会解析为Promises { <pending> }
我做错了什么?
const saltPassword = async (password) => {
const newHash = await bcrypt.hash(password, saltRounds, (err, hash) => {
if (err) return err;
return hash;
});
return await newHash;
}
欢呼声
答案 0 :(得分:2)
你应该做这样的事情
const saltPassword = async (password) => {
const newHash = await bcrypt.hash(password, saltRounds, (err, hash) => {
if (err) return err;
return hash;
});
return newHash; // no need to await here
}
// Usage
const pwd = await saltPassword;
答案 1 :(得分:0)
您需要返回Promise才能使用await
。只需包装回调函数并在出现错误时调用reject,如果成功则解析。
const saltPasswordAsync = (password, rounds) =>
new Promise((resolve, reject) => {
bcrypt.hash(password, rounds, (err, hash) => {
if (err) reject(err);
else resolve(hash)
});
});
async function doStuff() {
try {
const hash = await saltPasswordAsync('bacon', 8);
console.log('The hash is ', hash);
} catch (err) {
console.error('There was an error ', err);
}
}
doStuff();
现在,您可以使用await
等待承诺解析并使用该值。要捕获错误,请使用try / catch语句进行换行。
<强> 更新 强>
Thomas指出,你可能不需要在一个promise中包含回调,因为如果你没有传递一个回调函数,bcrypt会返回一个promise。您可以将saltPasswordAsync
上面的bycript.hash
调用替换为const hash = await bcrypt.hash('bacon', 8);
console.log('The hash is ', hash);
,如下所示:
routes/login.js