TypeORM 检查列是否已更改

问题描述 投票:0回答:2

所以,我将 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
  }
})

如有任何帮助,我们将不胜感激

node.js typescript sqlite express typeorm
2个回答
0
投票

根据TypeOrm文档,您可以在实体中定义具有任何名称的方法,并使用@BeforeUpdate装饰器标记它,TypeORM将在使用存储库/管理器保存更新现有实体之前调用它。

@BeforeUpdate()
  async updatePassword(): Promise<void> {
    this.password = await hashPassword(this.password);;
  }

你可以检查任何你想要的内容,但我认为没有必要,因为如果密码字段没有更改,它将是相同的,并且ORM无论如何都不会更新此列。仅当有更改时才会更新。

Mongoose 为我们提供了 isModified()isNew() 方法,因为它不会为您处理检查,您需要显式检查该字段是否实际被修改或新增。


0
投票

您可以使用 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);
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.