NestJS 事件

118 阅读2分钟

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 {}