Event Emitter 包 (@nestjs/event-emitter) 提供了一个简单的观察者实现,允许我们订阅和侦听应用程序中发生的各种事件。 事件是解耦应用程序各个方面的一个非常好的方法,因为单个事件可以有多个不依赖于彼此的侦听器。
安装
$ npm i --save @nestjs/event-emitter
导入
将 EventEmitterModule 导入根 AppModule 并运行 forRoot() 静态方法,如下所示:
import { Module } from '@nestjs/common';
import { EventEmitterModule } from '@nestjs/event-emitter';
@Module({
imports: [
EventEmitterModule.forRoot()
],
})
export class AppModule {}
配置对象
EventEmitterModule.forRoot({
// 将此设置为 `true` 以使用通配符
wildcard: false,
// 用于分割命名空间的分隔符
delimiter: '.',
// 如果要发出 newListener 事件,请将其设置为 `true`
newListener: false,
// 如果要发出 removeListener 事件,请将其设置为 `true`
removeListener: false,
// 可以分配给事件的最大侦听器数量
maxListeners: 10,
// 当分配的侦听器数量超过最大数量时,在内存泄漏消息中显示事件名称
verboseMemoryLeak: false,
// 如果发出错误事件并且它没有侦听器,则禁用抛出 uncaughtException
ignoreErrors: false,
});
定义自定义事件
user-created.event.ts
export class UserCreatedEvent {
constructor(
public readonly userId: number,
public readonly userName: string
) {}
}
创建事件发布者
cats/cats.service.ts
要调度(即触发)事件,首先: 从 @nestjs/event-emitter 包中导入 EventEmitter2。
import { Injectable } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { UserCreatedEvent } from './user-created.event';
@Injectable()
export class CatsService {
constructor(private eventEmitter: EventEmitter2) {}
async create(userId: number, userName: string) {
this.eventEmitter.emit('user.created', new UserCreatedEvent(userId, userName));
}
}
cats/cats.controller.ts
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get('event')
async getEvent() {
return await this.catsService.create(123456,'leolee');
}
}
创建事件订阅者
要声明事件侦听器,请在包含要执行的代码的方法定义之前使用 @OnEvent() 装饰器装饰方法
cats.created.listener.ts
import { OnEvent } from '@nestjs/event-emitter';
import { Injectable } from '@nestjs/common';
import { UserCreatedEvent } from './user-created.event';
@Injectable()
export class CatsCreatedListener {
@OnEvent('user.created')
handleUserCreatedEvent(event: UserCreatedEvent) {
console.log(event.userId, event.userName);
}
}
cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { CatsCreatedListener } from './cats.created.listener';
@Module({
controllers: [CatsController],
providers: [CatsService,CatsCreatedListener]
})
export class CatsModule {}