我正在尝试在创建记录和用户更新密码时为用户哈希密码。在创作时,我可以做类似的事情
User.beforeCreate((user, options) => {
user.password = encryptPassword(user.password)
})
这将很容易执行并散列新用户的密码。但是我在更新密码时遇到了问题。如果我只是这样做
User.beforeUpdate((user, options) => {
user.password = encryptPassword(user.password)
})
然后每次用户更新他们的记录(即更新名称、地址等)时,它都会触发钩子(Hook)并重新散列密码。
如何知道密码何时更改以便触发 Hook ?另外,我怎样才能使用
beforeSave
,而不是使用这 2 个钩子(Hook)?达到同样的效果?更新
根据要求,我的用户定义很简单
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"
}
}
}
}
)
最佳答案
嘿,让我试一试
所以首先你可以为两个钩子(Hook)运行相同的函数,如下所示:
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
.祝你好运 :)
关于sequelize.js - 创建和更新时的哈希密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45314883/