将散列密码保存到 Sequelize 违背了我保存散列密码的简单愿望

Saving hashed password to Sequelize is defying my simple wish to save a hashed password

这是我第一天将 Sequelize 与 postgreql 一起使用,所以请原谅我天真的问题。 我有一个简单的模型可以试用:

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

})

我使用 expressjs/node 和 passportJS 让用户 signup/register:

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)

我知道这是对密码 STRING 的续集验证,但我没有添加任何验证,以及什么类型的续集数据类型可以接受散列密码?

我了解如何向我的模型添加挂钩,并且它在保存到数据库之前正确地对密码进行哈希处理:

   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 正在强制采用特定的方式来做到这一点,所以对于那里的所有 sequelize NINJAS,我该如何解决这个问题?

您调用了 hash w/o 传递回调。

您需要使用同步版本 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
}