Пароль не сохраняется в базе данных с помощью Knex и Argon2 - PullRequest
2 голосов
/ 05 апреля 2020

Я пытаюсь заполнить свою базу данных несколькими примерами пользователей. Я использую Knex для своей базы данных postgres и npm -argon2 для хеширования паролей. Насколько я могу судить, моя простая функция hasing работает, но когда я запускаю ее во время вставки, она сохраняет пустой объект:

const argon = require('argon2');


exports.seed = function (knex) {
  return knex('users').del()
    .then(function () {

      const password_hash = async (password) => {
        let hash = await argon.hash(password);
        console.log(hash); // this works
        return hash; // this does not
      }

      return knex('users').insert([
        { username: 'John Doe', email: 'johndoe@example.com', password_hash: password_hash('abc123') },
        { username: 'Jane Doe', email: 'janedoe@example.com', password_hash: password_hash('abc123') }
      ]);
    });
};

Когда я запускаю свой начальный файл, я вижу, что хэши консоль правильно вошла в терминал, но когда я возвращаюсь в postgres, они оба сохраняются как {}. Что я делаю не так?

1 Ответ

1 голос
/ 07 апреля 2020

Ваша функция password_hash возвращает обещание (через ключевое слово async). Вставка происходит без ожидания генерирования хэшей (даже если вы видите вывод консоли). Что вы хотите сделать, это сделать это шаг за шагом:

const users = [
  { username: 'John Do', email: 'johndoe@example.com', password: 'abc123' }
]
for (let user of users) {
  user.password_hash = await password_hash(user.password)
}

// Write the users to the db, but omit the plaintext `password` property
return knex('users').insert(users.map(({ password, ...rest }) => rest)

Ваша содержащая функция должна быть объявлена ​​async.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...