Это мой первый день использования 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, как мне это исправить?
это Sequelize dataType? этого нет в их документах. sequelize.org/v5/manual/data-types.html — person Marco schedule 13.02.2021
Мое плохое, см. Ответ ниже — person Marco schedule 13.02.2021
Вы позвонили
hash
без обратного вызова.Вам необходимо использовать либо версию синхронизации
hashSync
вместоhash
или используйте асинхронную версию
hash
.