创建和更新哈希密码

spo*_*bob 1 sequelize.js

创建记录和用户更新密码时,我试图为用户哈希密码。在创作时,我可以做类似的事情

User.beforeCreate((user, options) => {
  user.password = encryptPassword(user.password)
})
Run Code Online (Sandbox Code Playgroud)

这将很容易执行,并为新用户哈希密码。但是更新密码时出现问题。如果我只是做

User.beforeUpdate((user, options) => {
  user.password = encryptPassword(user.password)
})
Run Code Online (Sandbox Code Playgroud)

然后,每次用户更新其记录(即更新名称,地址等)时,都会触发该钩子并重新哈希该密码。

如何知道何时更改密码,以便触发挂钩?另外,除了拥有这两个钩子之外,我如何才能使用它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"
        }
      }
    }
  }
)
Run Code Online (Sandbox Code Playgroud)

Dyl*_*den 5

嘿,让我试一下

因此,首先,您可以对两个钩子运行相同的功能,如下所示:

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

User.beforeCreate(encryptPasswordIfChanged);
User.beforeUpdate(encryptPasswordIfChanged);
Run Code Online (Sandbox Code Playgroud)

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

祝好运 :)