我将Sequelize Typescript模块用于无服务器lambda函数。用户模型有两个钩子,beforecreate和beforeupdate。用户模型如下所示:
import { Table, Column, ForeignKey, BeforeCreate, BeforeUpdate, BelongsTo } from 'sequelize-typescript';
import { Role } from './role';
import bcrypt from 'bcrypt-nodejs';
import { BaseModel } from './base';
const saltRounds = 10;
@Table({
tableName: 'users'
})
export class User extends BaseModel {
@Column
firstName!: string;
@Column
lastName!: string;
@Column
password!: string;
@Column
email!: string;
@Column
isActive!: boolean;
@Column
companyId: string
@ForeignKey(() => Role)
@Column
roleId!: string;
@BelongsTo(() => Role)
role!: Role;
@BeforeCreate
@BeforeUpdate
static hashPassword(user: User) {
if (user.password) {
var salt = bcrypt.genSaltSync(saltRounds);
user.password = bcrypt.hashSync(user.password, salt);
}
}
}
现在,当我创建一个新用户时,模型将对密码进行哈希处理并将哈希密码保存在表中,但是当我尝试更新用户密码时,密码将以纯文本格式保存。所以我猜@BeforeCreate可以正常工作,而@BeforeUpdate挂钩不能。
我什至尝试将两个钩子分开并赋予它们自己的功能:
@BeforeCreate
static hashPasswordBeforeCreate(user: User) {
if (user.password) {
var salt = bcrypt.genSaltSync(saltRounds);
user.password = bcrypt.hashSync(user.password, salt);
}
}
@BeforeUpdate
static hashPasswordBeforeUpdate(user: User) {
if (user.password) {
var salt = bcrypt.genSaltSync(saltRounds);
user.password = bcrypt.hashSync(user.password, salt);
}
}
但是之前的更新仍然无法正常工作。我在做什么错了?
答案 0 :(得分:1)
我认为您必须添加
individualHooks:是
在您的更新查询中,例如-users.update(data,{where:{id},personalHooks:true});
然后,您可以像user.dataValues这样将数据访问到@BeforeUpdate挂钩中。
例如。
@BeforeUpdate
static hashPasswordBeforeUpdate(user: User) {
user.dataValues.password = bcrypt.hashSync(user.dataValues.password, salt);
}
这种方法对我来说很好。