如何使用Hook(beforeCreate)和sequelize和mysql保存密码

时间:2017-09-24 05:42:50

标签: javascript node.js sequelize.js

我是sequelize的新手,我有一个模型用户,并且必须在用户创建之前加密密码,我使用钩子“beforeCreate”,但是不起作用。我的意思是,密码正确加密,但mysql没有。

当我使用console.log()时,密码会被加密,但是当我转到我的数据库时,密码不会被加密。

也许会忘记一些,但我遵循续集文档,我不知道我错过了什么

这是我的代码

//db
const mysql = require('mysql2')
const Sequelize = require('sequelize')
const connection = new Sequelize(config.MySql_db, config.MySql_user, 
config.Mysql_pass, 
              {
                host: config.MySql_host,
                dialect: 'mysql',
                port: config.MySql_port
              });

const UsuarioSchema = connection.define('Usuario', {
nombres: {type: Sequelize.STRING, allowNull: false},
apellidos: {type: Sequelize.STRING, allowNull: false},
email: {type: Sequelize.STRING, unique: true, lowercase: true, allowNull: false},
clave: {type: Sequelize.STRING, allowNull: false /*select:false*/}, //para que los get no retornen el password
fechaRegistro: {type: Sequelize.DATE, defaultValue: Sequelize.NOW},
fechaUltimoIngreso: {type: Sequelize.DATE},
perfil: {type: Sequelize.STRING, enum: ['Admin', 'Concursante'], defaultValue: 'Admin'}
  }, {
  timestamps: false,
  freezeTableName: true, //Evita que mysql pluralice el nombre de la BD
  hooks: {
      beforeCreate: (user)=>{
        bcrypt.genSalt(10, (err, salt) => {
                    if(err)
                        throw new Error(err)
                    bcrypt.hash(user.clave, salt, null, (err, hash) => {
                        if(err)
                            throw new Error(err)
                        else{
                            user.clave = hash  
                        }
                    })
                })
      }
  }
  });

UsuarioSchema.sync({logging: console.log}).then(function(){

}).catch((err)=>{
    console.log(`Error sincronizando el modelo Usuario ${err}`)
})

1 个答案:

答案 0 :(得分:1)

因为你的beforeCreate挂钩是异步操作,所以你应该调用回调函数或Promise。这是回调示例:

beforeCreate((user, options, cb) => {
    bcrypt.genSalt(10, (err, salt) => {   
      if (err) return cb(err);  
      bcrypt.hash(user.clave, salt, null, (err, hash) => {
         if (err) return cb(err);  
         user.clave = hash  
         return cb(null, options);
       })
    })  
});