Entity Listeners and Subscribers

What is an Entity Listener?

Any of your entities can have methods with custom logic that listen to specific entity events. You must mark those methods with special decorators depending on what event you want to listen to.

Note: Do not make any database calls within a listener, opt for subscribers instead.

@AfterLoad

You can define a method with any name in entity and mark it with @AfterLoad and TypeORM will call it each time the entity is loaded using QueryBuilder or repository/manager find methods. Example:

@Entity()
export class Post {
    @AfterLoad()
    updateCounters() {
        if (this.likesCount === undefined) this.likesCount = 0
    }
}

@BeforeInsert

You can define a method with any name in entity and mark it with @BeforeInsert and TypeORM will call it before the entity is inserted using repository/manager save. Example:

@Entity()
export class Post {
    @BeforeInsert()
    updateDates() {
        this.createdDate = new Date()
    }
}

@AfterInsert

You can define a method with any name in entity and mark it with @AfterInsert and TypeORM will call it after the entity is inserted using repository/manager save. Example:

@BeforeUpdate

You can define a method with any name in the entity and mark it with @BeforeUpdate and TypeORM will call it before an existing entity is updated using repository/manager save. Keep in mind, however, that this will occur only when information is changed in the model. If you run save without modifying anything from the model, @BeforeUpdate and @AfterUpdate will not run. Example:

@AfterUpdate

You can define a method with any name in the entity and mark it with @AfterUpdate and TypeORM will call it after an existing entity is updated using repository/manager save. Example:

@BeforeRemove

You can define a method with any name in the entity and mark it with @BeforeRemove and TypeORM will call it before an entity is removed using repository/manager remove. Example:

@AfterRemove

You can define a method with any name in the entity and mark it with @AfterRemove and TypeORM will call it after the entity is removed using repository/manager remove. Example:

@BeforeSoftRemove

You can define a method with any name in the entity and mark it with @BeforeSoftRemove and TypeORM will call it before an entity is soft removed using repository/manager softRemove. Example:

@AfterSoftRemove

You can define a method with any name in the entity and mark it with @AfterSoftRemove and TypeORM will call it after the entity is soft removed using repository/manager softRemove. Example:

@BeforeRecover

You can define a method with any name in the entity and mark it with @BeforeRecover and TypeORM will call it before an entity is recovered using repository/manager recover. Example:

@AfterRecover

You can define a method with any name in the entity and mark it with @AfterRecover and TypeORM will call it after the entity is recovered using repository/manager recover. Example:

What is a Subscriber?

Marks a class as an event subscriber which can listen to specific entity events or any entity events. Events are firing using QueryBuilder and repository/manager methods. Example:

You can implement any method from EntitySubscriberInterface. To listen to any entity you just omit listenTo method and use any:

Make sure your subscribers property is set in your DataSourceOptions so TypeORM loads your subscriber.

Event Object

Excluding listenTo, all EntitySubscriberInterface methods are passed an event object that has the following base properties:

  • dataSource: DataSource - DataSource used in the event.

  • queryRunner: QueryRunner - QueryRunner used in the event transaction.

  • manager: EntityManager - EntityManager used in the event transaction.

See each Event's interfacearrow-up-right for additional properties.

Note that event.entity may not necessarily contain primary key(s) when Repository.update() is used. Only the values provided as the entity partial will be available. In order to make primary keys available in the subscribers, you can explicitly pass primary key value(s) in the partial entity object literal or use Repository.save(), which performs re-fetching.

Note: All database operations in the subscribed event listeners should be performed using the event object's queryRunner or manager instance.

Last updated