实体监听器和订阅者

监听器

任何实体都可以使用具有侦听特定实体事件的自定义逻辑的方法。 你必须使用特殊装饰器标记这些方法,具体取决于要侦听的事件。

@AfterLoad

你可以在实体中定义具有任何名称的方法,并使用@AfterLoad标记它,TypeORM 将在每次实体时调用它 使用QueryBuilder或 repository/manager 查找方法加载。 例如:
1
@Entity()
2
export class Post {
3
@AfterLoad()
4
updateCounters() {
5
if (this.likesCount === undefined) this.likesCount = 0;
6
}
7
}
Copied!

@BeforeInsert

你可以在实体中定义具有任何名称的方法,并使用@BeforeInsert标记它,并且 TypeORM 将在使用 repository/manager save插入实体之前调用它。 例如:
1
@Entity()
2
export class Post {
3
@BeforeInsert()
4
updateDates() {
5
this.createdDate = new Date();
6
}
7
}
Copied!

@AfterInsert

你可以在实体中定义具有任何名称的方法,并使用@AfterInsert标记它,并且在使用 repository/manager save插入实体后,TypeORM 将调用它。
1
@Entity()
2
export class Post {
3
@AfterInsert()
4
resetCounters() {
5
this.counters = 0;
6
}
7
}
Copied!

@BeforeUpdate

你可以在实体中定义具有任何名称的方法,并使用@BeforeUpdate标记它,并且 TypeORM 将在使用 repository/manager save更新现有实体之前调用它。 但请记住,只有在模型中更改信息时才会出现这种情况。 如果运行save而不修改模型中的任何内容,@BeforeUpdate@AfterUpdate将不会运行。 例如:
1
@Entity()
2
export class Post {
3
@BeforeUpdate()
4
updateDates() {
5
this.updatedDate = new Date();
6
}
7
}
Copied!

@AfterUpdate

你可以在实体中定义具有任何名称的方法,并使用@AfterUpdate标记它,并且在使用 repository/manager save更新现有实体后,TypeORM 将调用它。 例如:
1
@Entity()
2
export class Post {
3
@AfterUpdate()
4
updateCounters() {
5
this.counter = 0;
6
}
7
}
Copied!

@BeforeRemove

你可以在实体中定义具有任何名称的方法,并使用@BeforeRemove标记它,并且 TypeORM 将在使用 repository/manager remove删除实体之前调用它。 例如:
1
@Entity()
2
export class Post {
3
@BeforeRemove()
4
updateStatus() {
5
this.status = "removed";
6
}
7
}
Copied!

@AfterRemove

你可以在实体中定义一个具有任何名称的方法,并使用@ AfterRemove标记它,TypeORM 将在使用 repository/manager remove删除实体后调用它。 例如:
1
@Entity()
2
export class Post {
3
@AfterRemove()
4
updateStatus() {
5
this.status = "removed";
6
}
7
}
Copied!

订阅者

将类标记为可以侦听特定实体事件或任何实体事件的事件订阅者。 使用QueryBuilder和存储库/管理器方法触发事件。 例如:
1
@EventSubscriber()
2
export class PostSubscriber implements EntitySubscriberInterface<Post> {
3
/**
4
* 表示此订阅者仅侦听Post事件。
5
*/
6
listenTo() {
7
return Post;
8
}
9
10
/**
11
* 插入post之前调用。
12
*/
13
beforeInsert(event: InsertEvent<Post>) {
14
console.log(`BEFORE POST INSERTED: `, event.entity);
15
}
16
}
Copied!
你可以从EntitySubscriberInterface实现任何方法。 要监听任何实体,你只需省略listenTo方法并使用any
1
@EventSubscriber()
2
export class PostSubscriber implements EntitySubscriberInterface {
3
/**
4
* 在实体插入之前调用。
5
*/
6
beforeInsert(event: InsertEvent<any>) {
7
console.log(`BEFORE ENTITY INSERTED: `, event.entity);
8
}
9
}
Copied!
Last modified 1mo ago