MongoDB 存储 "Promise" 对象而不是散列密码
MongoDB stores "Promise" object instead of hashed password
我正在使用 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: 'blabla@gmail.com',
password_hash: [Promise],
_id: 5ecc8b752e0aa53e87d5b62a
}
],
makeUser
的对象似乎没有等待pwdHasher(password)
。我曾尝试将 pwdHasher
包装在 Promise 中,但它也没有用。
有人知道为什么吗?
谢谢。
根据您的代码片段,我看到了两种解决方案:
第一种方式:(推荐)
调用async
函数时使用await
。代码将是:
export default function buildMakeUser({pwdHasher})
{
return function makeUser({
...
password_hash = await pwdHasher(password), // the important part
...
})
}
替代方式:
使用 bcrypt
的 hashSync
方法,而不是使用异步等待。
您已将 pwdHasher
定义为:
async function pwdHasher(password) { ... }
但你称它为:
password_hash = pwdHasher(password),
根据定义,异步函数 RETURNS PROMISE。如果您想从承诺中获得价值,您必须 await
结果或使用 pwdHasher(password).then(...)
我正在使用 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: 'blabla@gmail.com',
password_hash: [Promise],
_id: 5ecc8b752e0aa53e87d5b62a
}
],
makeUser
的对象似乎没有等待pwdHasher(password)
。我曾尝试将 pwdHasher
包装在 Promise 中,但它也没有用。
有人知道为什么吗?
谢谢。
根据您的代码片段,我看到了两种解决方案:
第一种方式:(推荐)
调用async
函数时使用await
。代码将是:
export default function buildMakeUser({pwdHasher})
{
return function makeUser({
...
password_hash = await pwdHasher(password), // the important part
...
})
}
替代方式:
使用 bcrypt
的 hashSync
方法,而不是使用异步等待。
您已将 pwdHasher
定义为:
async function pwdHasher(password) { ... }
但你称它为:
password_hash = pwdHasher(password),
根据定义,异步函数 RETURNS PROMISE。如果您想从承诺中获得价值,您必须 await
结果或使用 pwdHasher(password).then(...)