Существует ли шаблон кода для возврата хеша bcrypt, созданного с помощью функции async, в отдельный модуль? - PullRequest
0 голосов
/ 30 сентября 2019

Есть ли элегантный способ вернуть значение хеша bcrypt в отдельный модуль?

В приведенном ниже примере функция hashPassword () использует bcrypt для хеширования пароля. Он находится в файле hashpassword.js. Я хотел бы вернуть значение хеша переменной myHashedPassword в app.js. Я уверен, что для этого должен быть грубый метод. Но есть ли какой-нибудь умный или элегантный способ вернуть значение?

app.js

let password = '123';
let myHashedPassword = hashPassword(password);

hashpassword.js

function hashPassword(password) {
    bcrypt.genSalt(10, function(error, salt) {
        bcrypt.hash(password, salt, function(error, hash) {
            // In most cases at this point hash is saved to the database.
            // However is there a pattern to return its value to the outer function and then app.js?
            // With this being async is that even possible?
        });
    }); 
}

1 Ответ

1 голос
/ 30 сентября 2019

Пакет bcrypt имеет синхронные эквиваленты используемым функциям, см. пример . Если вы все еще хотите использовать асинхронные версии, вам нужно будет вернуть Promise, который вы можете затем await например,

function hashPassword(password) {
  return new Promise((resolve, reject) => {
    bcrypt.genSalt(10, (error, salt) => {
      if (error) return reject(error);

      bcrypt.hash(
        password, 
        salt, 
        (error, hash) => err ? reject(err) : resolve(hash)
      );
    }); 
  });
}
...
let hashed = await hashPassword(password);

В терминах экспорта таким образом, что потребитель просто вызываетфункция, если используется ES6 или новее

export default function hashPassword(password) {
  ...
}

В противном случае

function hashPassword(password) {
  ...
}

module.exports = hashPassword
...