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 
        ...
    })  
}

替代方式:
使用 bcrypthashSync 方法,而不是使用异步等待。

您已将 pwdHasher 定义为:

async function pwdHasher(password) { ... }

但你称它为:

password_hash = pwdHasher(password),

根据定义,异步函数 RETURNS PROMISE。如果您想从承诺中获得价值,您必须 await 结果或使用 pwdHasher(password).then(...)