所以,我将 TypeORM 与 ActiveRecord 模式结合使用并拥有这个实体
@Entity()
export class User {
@PrimaryGeneratedColumn()
public id: number;
@Column()
public username: string;
@Column()
public password: string;
@BeforeInsert()
public async hashPassword() {
this.password = await hashPassword(this.password);
}
}
现在我想要完成的是在任何给定用户更改时重新哈希我的密码,但前提是密码字段发生更改。我已经看到一些答案,我应该将 tempPassword 作为字段存储在 User 类中,但如果由于某种原因服务器出现故障,我将丢失该数据。我还看到一些人建议 typeorm 具有订阅者功能,我对此很感兴趣,但不太确定我将如何实现它。 作为参考,这就是我如何用猫鼬做我想做的事情
UserSchema.pre("save", function(next) {
if (this.isModified("password") || this.isNew) {
// hash the password
}
})
如有任何帮助,我们将不胜感激
根据TypeOrm文档,您可以在实体中定义具有任何名称的方法,并使用@BeforeUpdate装饰器标记它,TypeORM将在使用存储库/管理器保存更新现有实体之前调用它。
@BeforeUpdate()
async updatePassword(): Promise<void> {
this.password = await hashPassword(this.password);;
}
你可以检查任何你想要的内容,但我认为没有必要,因为如果密码字段没有更改,它将是相同的,并且ORM无论如何都不会更新此列。仅当有更改时才会更新。
Mongoose 为我们提供了 isModified() 和 isNew() 方法,因为它不会为您处理检查,您需要显式检查该字段是否实际被修改或新增。
您可以使用 AfterLoad 装饰器将旧密码存储为私有临时变量,并将其与新密码进行比较。
private tempPassword: string;
@AfterLoad()
storeOriginalPassword() {
this.tempPassword = this.password;
}
@BeforeInsert()
public async hashPassword() {
if (this.password && this.password !== this.tempPassword) {
this.password = await hashPassword(this.password);
}
}