是否有代码模式 return bcrypt hash created with async function to a separate module?

Is there a code pattern to return bcrypt hash created with async function to a separate module?

有没有一种优雅的方法可以将 bcrypt 哈希值 return 到一个单独的模块?

在下面的示例中,函数 hashPassword() 使用 bcrypt 来散列密码。它位于文件 hashpassword.js 中。我想 return 它的哈希值到 app.js 中的变量 myHashedPassword。我敢肯定必须有一种蛮力的方式来做到这一点。但是有没有什么聪明或优雅的方法来 return 这个值?

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?
        });
    }); 
}

bcrypt package has synchronous equivalents to the functions you are using, see example。如果您仍然想利用异步版本,那么您需要 return 一个 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

如果您更喜欢使用开箱即用的非阻塞 bcrypt 函数 await/async:

import bcrypt from 'bcrypt';

const salt = await bcrypt.genSalt(10);
var hash = await bcrypt.hash(clear_text_password, salt);

然后进行身份验证

const match = await bcrypt.compare(clear_text_password, hash);

if(match) { // do something awesome }