创建和更新时的哈希密码

时间:2017-07-25 23:11:14

标签: sequelize.js

我正在尝试在创建记录时以及用户更新密码时为用户哈希密码。在创作时,我可以做类似

的事情
User.beforeCreate((user, options) => {
  user.password = encryptPassword(user.password)
})

这将很容易执行并为新用户散列密码。但是在更新密码时我遇到了问题。如果我只是做

User.beforeUpdate((user, options) => {
  user.password = encryptPassword(user.password)
})

然后每次用户更新他们的记录(即更新名称,地址等)时,它会触发挂钩并重新哈希密码。

如何更改密码以便我可以触发挂钩?而不是使用这两个钩子,我怎样才能使用beforeSave来获得相同的结果?

更新

根据要求,我的用户定义就像

一样简单
sequelize.define(
  'user',
  {
    id: {
      type:          Sequelize.INTEGER,
      autoIncrement: true,
      primaryKey:    true,
    },
    emailAddress: {
      field:        'email_address',
      type:         Sequelize.STRING,
      allowNull:    false,
      unique:       true,
      validate: {
        isEmail: {
          args:     true,
          msg:      "Email is not valid"
        }
      },
    },
    password: {
      type:         Sequelize.STRING,
      allowNull:    false,
      validate: {
        min: {
          args:     6,
          msg:      "Password must be more than 6 characters"
        }
      }
    }
  }
)

1 个答案:

答案 0 :(得分:5)

嘿,让我试一试

首先,你可以为两个类似于下面的钩子运行相同的功能:

function encryptPasswordIfChanged(user, options) {
  if (user.changed('password')) {
    encryptPassword(user.get('password'));
  }
}

User.beforeCreate(encryptPasswordIfChanged);
User.beforeUpdate(encryptPasswordIfChanged);

如果要更改更新中的密码并创建API端点,只需拨打user.set('password', somePasswordString);即可。我不确定这是否正是你所需要的,但我认为这种模式可以满足你的需要。在创建用户时,.changed函数应返回true,因为密码的_previousDataValues应为undefined

祝你好运:)