MongoDB存储“ Promise”对象而不是哈希密码

问题描述 投票:0回答:2

我正在使用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中,但也没有用。

有人知道为什么吗?

谢谢。

javascript node.js mongodb bcrypt
2个回答
2
投票

根据您的代码段,我看到了两种解决方案:

第一种方式:(推荐)调用await功能时,请使用async。代码将是:

export default function buildMakeUser({pwdHasher})
{
    return function makeUser({
        ...
        password_hash = await pwdHasher(password), // the important part 
        ...
    })  
}

替代方式:使用hashSynchashSync方法代替使用async-await。


1
投票

您已将bcrypt定义为:

pwdHasher

但是您称它为:

async function pwdHasher(password) { ... }

按照定义,异步函数返回一个承诺。如果您想从承诺中获得价值,则必须password_hash = pwdHasher(password), 结果或使用await

© www.soinside.com 2019 - 2024. All rights reserved.