我正在使用bcrypt哈希密码,并将MongoDB作为我的数据库。
这里是代码:
export default function buildMakeUser({pwdHasher})
{
return function makeUser({
username,
email,
password,
password_hash = pwdHasher(password), // the important part
favoriteColor
} = {})
{
// ...
return Object.freeze({
getUsername: () => username,
getEmail: () => email,
getHashedPassword: () => password_hash,
getFavoriteColor: () => favoriteColor
});
}
这是pwdHasher
的定义:
import bcrypt from "bcrypt";
import buildMakeUser from "./entity/user.js";
async function pwdHasher(password){
let hashed;
hashed = await bcrypt.hash(password, 10);
return hashed;
}
但是,当我将用户存储在数据库中时,结果如下:
ops: [
{
username: 'kibe',
email: '[email protected]',
password_hash: [Promise],
_id: 5ecc8b752e0aa53e87d5b62a
}
],
似乎makeUser
的对象没有等待pwdHasher(password)
。我尝试将pwdHasher
包装在Promise中,但也没有用。
有人知道为什么吗?
谢谢。
根据您的代码段,我看到了两种解决方案:
第一种方式:(推荐)调用await
功能时,请使用async
。代码将是:
export default function buildMakeUser({pwdHasher})
{
return function makeUser({
...
password_hash = await pwdHasher(password), // the important part
...
})
}
替代方式:使用hashSync
的hashSync
方法代替使用async-await。
您已将bcrypt
定义为:
pwdHasher
但是您称它为:
async function pwdHasher(password) { ... }
按照定义,异步函数返回一个承诺。如果您想从承诺中获得价值,则必须password_hash = pwdHasher(password),
结果或使用await