MongoDB хранит объект "Promise" вместо хешированного пароля. - PullRequest
0 голосов
/ 26 мая 2020

Я использую bcrypt для паролей sh и 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 в обещание, и это тоже не сработало.

Кто-нибудь знает почему?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Я вижу два решения, основанных на вашем фрагменте кода:

Первый способ: (рекомендуется)
Используйте await при вызове функции async. Код будет:

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

Альтернативный способ:
Используйте hashSync метод bcrypt вместо использования asyn c -await .

1 голос
/ 26 мая 2020

Вы определили pwdHasher как:

async function pwdHasher(password) { ... }

Но вы называете это как:

password_hash = pwdHasher(password),

По определению, функция asyn c ВОЗВРАЩАЕТ ОБЕЩАНИЕ. Если вы хотите получить значение из обещания, вы должны либо await результат, либо использовать pwdHasher(password).then(...)

...