我正在尝试在创建记录时以及用户更新密码时为用户哈希密码。在创作时,我可以做类似
的事情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"
}
}
}
}
)
答案 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
。