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相关。但我仍然不明白为什么在触发更新/创建挂钩时不应用验证。我已经添加了我的用户定义。