2017-02-04 19 views
1

Это может быть мнение основано. Но я хотел бы получить совет.use Sequelize with bcrypt async

Итак, что я хочу сделать, можно сделать так, как указано в this thread. Но this thread сделал хороший момент, почему я хотел бы использовать async.

Вот что у меня есть, и это работает.

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

Поскольку я использую async для bcrypt, мне нужно будет сохранить зашифрованный пароль в другом запросе. Чувство моего чувства говорит мне, что может быть лучший способ использовать асинхронный скрипт bcrypt с sequelize.

Мой вопрос: какой предпочтительный/лучший подход? Или я просто соглашаюсь с использованием bcrypt синхронно?

ответ

3

Асинхронный это путь просто привести в порядок ваш код немного и использовать функцию обратного вызова в челноке

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); 
    }); 
}); 
+0

Спасибо за ответ. Основная причина, по которой мне не нравится в этом подходе, - это два вызова sql для сохранения одного нового пользователя. –

+0

Существует только один вызов sql, мы не вызываем сохранение здесь, мы меняем данные до того, как вызов sql стал более явным, вы написали сохранение вызова, который не требуется –

+0

hmm ... Запись может сохраняться до хэша пароля генерируется, нет? так как это async .. –