Сохранение хешированного пароля в Sequelize противоречит моему простому желанию сохранить хешированный пароль

Это мой первый день использования Sequelize с postgreql, так что простите за мои наивные вопросы. У меня есть простая модель, чтобы опробовать ее:

var User = sequelize.define("user", {
username: Sequelize.STRING,
password: Sequelize.STRING

})

Я использую expressjs / node и паспорт JS, чтобы пользователь мог зарегистрироваться / зарегистрироваться:

passport.use('local-register', new LocalStrategy({
   passReqToCallback: true
}, function (req, username, password, done) {

User.findOne({ where: { username: username } }).then(function (user) {
    if (user) {   
        return done(null, false, { message: "enter  email that belongs to you please..." }, 
       console.log('That email is already taken'));
    } else {
       
         //use bcrypt to salt and hash the password
         let saltRounds = 2;
         let hashedpass = bcrypt.hash(password, saltRounds);           

        var data = {
            username: username,
            password: hashedpass  //password
        };
        User.create(data).then(function (newUser, created) {
            if (!newUser) {
                return done(null, false);
            }
            if (newUser) {
                return done(null, newUser);
            }
        });
    }
}).catch(err => { console.log("catch error :", err) });
}));

Теперь, когда я пытаюсь зарегистрироваться как пользователь, я получаю сообщение об ошибке:

UnhandledPromiseRejectionWarning: SequelizeValidationError: string violation: password cannot be an array or an object
at InstanceValidator._validate (D:\mycode\postegresql\postee1\node_modules\sequelize\lib\instance-validator.js:78:13)
at processTicksAndRejections (internal/process/next_tick.js:81:5)

Я понимаю, что это проверка sequelize для пароля STRING, но я не добавлял никакой проверки и какой тип данных sequelize принимает хешированный пароль?

Я понимаю, как добавлять крючки в мою модель, и он правильно хеширует пароль перед сохранением в базу данных:

   hooks: {
        beforeCreate: (user) => {
            const salt = bcrypt.genSaltSync(2);
            user.password = bcrypt.hashSync(user.password, salt);
        }
    },
    instanceMethods: {
        validPassword: function (password) {
            return bcrypt.compareSync(password, this.password);
        }
    }

Но я хочу хешировать пароль в коде моего сервера, как я пытался сделать выше. Как исправить ошибку проверки, указанную выше? Я просто хочу использовать Bycrpt в своем паспорте. Тип данных неправильный? Как исправить эту ошибку, не трогая мою модель? Это не должно быть проблемой, потому что я уже хешировал пароль, мне просто нужно его сохранить, но похоже, что Sequelize заставляет это делать определенным образом, поэтому для всех продолжений NINJAS, как мне это исправить?

См. также:  AWS sam SES sendEmail возвращает InvalidClientTokenId (nodejs / lambda)

это Sequelize dataType? этого нет в их документах. sequelize.org/v5/manual/data-types.html   —  person Marco    schedule 13.02.2021

Мое плохое, см. Ответ ниже   —  person Marco    schedule 13.02.2021

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Marco

    Вы позвонили hash без обратного вызова.

    Вам необходимо использовать либо версию синхронизации hashSync вместо hash

    let hashedpass = bcrypt.hashSync(password, saltRounds);
    

    или используйте асинхронную версию hash.

    let hashedpass = await bcrypt.hash(password, saltRounds);
    // OR
    bcrypt.hash(password, saltRounds).then(hash => {
      hashedpass = hash
    }
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: