Sequelize.js 创建和更新时哈希密码

Sequelize.js 创建和更新时哈希密码,sequelize.js,Sequelize.js,我试图在创建记录和用户更新密码时为用户散列密码。在创作上,我可以做一些像 User.beforeCreate((user, options) => { user.password = encryptPassword(user.password) }) 这将很容易执行和散列新用户的密码。但是我在更新密码时遇到了一个问题。如果我这么做的话 User.beforeUpdate((user, options) => { user.password = encryptPassword

我试图在创建记录和用户更新密码时为用户散列密码。在创作上,我可以做一些像

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"
        }
      }
    }
  }
)

嘿,让我来试一试

因此,首先,您可以为两个钩子运行相同的函数,如下所示:

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
,因为密码的
\u previousDataValues
应该是
未定义的


祝你好运:)

嘿,看起来不错。使用
.changed()
我可以知道密码何时更改。但另一个问题是钩子不会触发验证。所以,如果我的验证显示最小密码为6个字符,我仍然可以传递3位数字的密码。您检查了吗?这意味着验证钩子将在这两个钩子之前运行。如果您发布您正在处理的用户表的Sequelize定义,我可能会给您一些见解。我理解挂钩顺序,它仍然与我正在使用的v4相关。但我仍然不明白为什么在触发更新/创建挂钩时不应用验证。我已经添加了我的用户定义。