【问题标题】:use Sequelize with bcrypt async将 Sequelize 与 bcrypt async 一起使用
【发布时间】:2017-02-06 14:50:53
【问题描述】:

这可能是基于意见的。但我想得到一些建议。

那么,我想做的事情可以按照this thread中提到的方式来完成。 但是this thread 很好地说明了为什么我要使用异步。

这是我目前所拥有的,而且它有效。

User.create({email: req.body.email, password: req.body.password}).catch(function(err){
  console.log(err);
});

User.beforeCreate(function(user) {
  const password = user.password;
  user.password = '';
  bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
    if(err) console.error(err);
    bcrypt.hash(user.password, salt, null, function(err, hash) {
      if(err) console.error(err);
      user.password = hash;
      user.save();
    });
  });
});

由于我使用的是 bcrypt 异步,我必须在另一个查询中保留加密密码。我的直觉告诉我,使用 bcrypt async 和 sequelize 可能会有更好的方法。

我的问题是,首选/更好的方法是什么?还是我应该只解决同步使用 bcrypt 的问题?

【问题讨论】:

    标签: javascript node.js sequelize.js bcrypt


    【解决方案1】:

    异步是一种只需整理一下代码并在挂钩中使用回调的方法

    function cryptPassword(password, callback) {
        bcrypt.genSalt(10, function(err, salt) { // Encrypt password using bycrpt module
            if (err)
                return callback(err);
    
            bcrypt.hash(password, salt, function(err, hash) {
                return callback(err, hash);
            });
        });
    }
    
    User.beforeCreate(function(model, options, cb) {
      debug('Info: ' + 'Storing the password');    
      cryptPassword(user.password, function(err, hash) {
        if (err) return cb(err);
        debug('Info: ' + 'getting ' + hash);
    
        user.password = hash;
        return cb(null, options);
      });
    });
    

    【讨论】:

    • 感谢您的回答。我不喜欢这种方法的主要原因是,会有两个 sql 调用来持久化一个新用户。
    • 只有一个sql调用,我们这里没有调用save,我们是在sql调用之前改变数据,你写了save调用,不是必须的
    • hmm... 在生成密码哈希之前,记录可能会被保留,不是吗?因为它是异步的..
    • 它不会被保存,因为我们在这两种情况下都使用回调。
    • 在文档中不清楚需要深入研究代码,文档更关注承诺,我参考了:stackoverflow.com/questions/31427566/…
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2015-11-09
    • 1970-01-01
    • 2017-02-21
    • 2017-11-05
    • 2015-03-01
    相关资源
    最近更新 更多