Есть ли разница между этими методами шифрования пароля перед созданием модели?Они оба асинхронные? - PullRequest
0 голосов
/ 06 июня 2019

Я впервые использую sequelize и пытаюсь использовать хуки, и, кроме того, я только узнаю об обещаниях в JS.У меня есть два способа реализации функции, но мне интересно, если один асинхронный, а другой нет?

// METHOD 1
User.addHook("beforeCreate", (user) => {
  user.password = bcrypt.hashSync(user.password, bcrypt.genSaltSync(8), null);
});

// METHOD 2
User.addHook("beforeCreate", (user, options) => {     
  return bcrypt.hashSync(user.password, bcrypt.genSaltSync(8), null)
    .then(hashedPw => {
      user.password = hashedPw;
    });
});

Также, если кто-то знает, для чего нужен параметр 'options', метод 2 по существу взят из документации Sequelize, и у него есть параметр 'options', но я не вижу, где он используется ...

РЕДАКТИРОВАТЬ

Комментарии позволили мне понять, что вышеприведенные методы не являются асинхронными, поскольку они используют hashSync, поэтому я сделал новую реализацию, но это все равно приводит к тому, что нехэшированный пароль сохраняется в БД...

const saltRounds = 8;
User.addHook("beforeCreate", (user) => {
  bcrypt.genSalt(saltRounds, function(err, salt) {
    bcrypt.hash(user.password, salt, null, function(err, hash) {
        user.password = hash;
    });
  });
});

Ответы [ 3 ]

0 голосов
/ 07 июня 2019

Проблема в вашем коде в том, что hook in sequelize вызывается асинхронно.Таким образом, ваш код должен быть примерно таким, чтобы он работал

const saltRounds = 8;
User.addHook("beforeCreate", (user, options, callback) => {
  bcrypt.genSalt(saltRounds, function(err, salt) {
    bcrypt.hash(user.password, salt, null, function(err, hash) {
        user.password = hash;

        callback(null, user);
    });
  });
});

на неродственной ноте, может быть хорошей идеей обещать эти функции, используя что-то вроде bluebird или пакета util из узла

0 голосов
/ 07 июня 2019

Если вы хотите использовать sequelize hooks и bcrypt для асинхронного хеширования пароля перед созданием, вам нужно сделать:

beforeCreate: async function(user) {
    const salt = await bcrypt.genSalt(10); 
    user.password = await bcrypt.hash(user.password, salt);
}

Ответ найден по адресу: Использование BCrypt сМодель Sequelize

Автор: @ user1274820

0 голосов
/ 07 июня 2019

@ WillCowan Метод 2 не будет работать, как упомянуто в документе Bcrypt hasSync() не возвращает обещание.

Опции передаются как второй параметр, который обычно используется для изменения поведения метода по умолчанию и передачи некоторых дополнительных настроек в соответствии с документом sequelize.

Вы сталкиваетесь с какой-либо проблемой в реализации?

РЕДАКТИРОВАТЬ

Я написал и протестировал следующий код, пожалуйста, проверьте:

const saltRounds = 8;
User.addHook('beforeCreate',(user,options)=>{
 var salt = bcrypt.genSaltSync(saltRounds);
 var hash = bcrypt.hashSync(user.password, salt);
 user.password = hash
 })

  User.create({
    username: "shi",
    birthday: new Date(),
    password:"hello123"
  }).then((user) => {
    console.log("user detail \n", user.userInfo);
  })

Этопечать shi_Fri Jun 07 2019 14:05:07 GMT+0530 (IST)_$2b$10$os4R7AALhNfYW2namfw0GOGn0hDd0ugEE2hOuoJVzDxL6qNxnG7G2

...