Nest.js 事件 Events
Event Emitter 包 (@nestjs/event-emitter)
提供了一个简单的观察者实现,允许我们订阅和侦听应用程序中发生的各种事件。 事件是解耦应用程序各个方面的一个非常好的方法,因为单个事件可以有多个不依赖于彼此的侦听器。
EventEmitterModule
在内部使用 eventemitter2 包。
开始
首先安装所需的包:
$ 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 {}
.forRoot()
调用初始化事件发射器并注册应用程序中存在的任何声明性事件侦听器。 注册发生在 onApplicationBootstrap
生命周期钩子发生时,确保所有模块都已加载并声明了任何计划的作业。
要配置底层 EventEmitter
实例,请将配置对象传递给 .forRoot()
方法,如下所示:
EventEmitterModule.forRoot({
// 将此设置为 `true` 以使用通配符
wildcard: false,
// 用于分割命名空间的分隔符
delimiter: '.',
// 如果要发出 newListener 事件,请将其设置为 `true`
newListener: false,
// 如果要发出 removeListener 事件,请将其设置为 `true`
removeListener: false,
// 可以分配给事件的最大侦听器数量
maxListeners: 10,
// 当分配的侦听器数量超过最大数量时,在内存泄漏消息中显示事件名称
verboseMemoryLeak: false,
// 如果发出错误事件并且它没有侦听器,则禁用抛出 uncaughtException
ignoreErrors: false,
});
调度事件
要调度(即触发)事件,首先使用标准构造函数注入来注入 EventEmitter2
:
constructor(private eventEmitter: EventEmitter2) {}
提示
: 从 @nestjs/event-emitter 包中导入 EventEmitter2。
然后在一个类中使用如下:
this.eventEmitter.emit(
'order.created',
new OrderCreatedEvent({
orderId: 1,
payload: {},
}),
);
监听事件
要声明事件侦听器,请在包含要执行的代码的方法定义之前使用 @OnEvent()
装饰器装饰方法,如下所示:
@OnEvent('order.created')
handleOrderCreatedEvent(payload: OrderCreatedEvent) {
// 处理“OrderCreatedEvent”事件
}
警告
:事件订阅者不能是request-scoped 的。
第一个参数可以是简单事件发射器的 string
或 symbol
和 string | symbol | Array<string | symbol>
在通配符发射器的情况下。 第二个参数(可选)是一个监听器选项对象。
@OnEvent('order.created', { async: true })
handleOrderCreatedEvent(payload: OrderCreatedEvent) {
// 处理“OrderCreatedEvent”事件
}
要使用命名空间/通配符,请将 wildcard
选项传递给 EventEmitterModule#forRoot()
方法。 启用命名空间/通配符后,事件可以是由分隔符分隔的字符串 (foo.bar
) 或数组 (['foo', 'bar']
)。 分隔符也可配置为配置属性(delimiter
)。 启用命名空间功能后,我们可以使用通配符订阅事件:
@OnEvent('order.*')
handleOrderEvents(payload: OrderCreatedEvent | OrderRemovedEvent | OrderUpdatedEvent) {
// 处理事件
}
请注意,这样的通配符仅适用于一个块。 例如,参数 order.*
将匹配事件 order.created 和 order.shipped 但不匹配 order.delayed.out_of_stock。 为了监听此类事件,请使用 EventEmitter2 文档中描述的多级通配符模式(即 **
)。
例如,使用此模式,我们可以创建一个捕获所有事件的事件侦听器。
@OnEvent('**')
handleEverything(payload: any) {
// 处理事件
}
提示
: EventEmitter2 类提供了几个与事件交互的有用方法,例如 waitFor 和 onAny。