## 事件
[Event Emitter 事件发射器](https://www.npmjs.com/package/@nestjs/event-emitter) 包(`@nestjs/event-emitter`)提供了一个简单的观察者实现,允许你订阅和监听在你应用中发生的不同事件。事件服务器是将应用程序的不同部分解耦的一个伟大的方法,因为一个事件可以被不同的监听者监听,且他们之间并不互相依赖。
`EventEmitterModule`在内部使用[eventmitter2](https://github.com/EventEmitter2/EventEmitter2)包。
### 开始
首先安装依赖。
```bash
$ npm i --save @nestjs/event-emitter
```
安装完成后,在`root`的`AppModule`中引入`EventEmitterModule`并且在`forRoot()`静态方法中运行:
```TypeScript
import { Module } from '@nestjs/common';
import { EventEmitterModule } from '@nestjs/event-emitter';
@Module({
imports: [
EventEmitterModule.forRoot()
],
})
export class AppModule {}
```
`.forRoot()`调用与初始化事件发射器并注册应用程序中各个声明的事件监听器。注册发生在`onApplicationBootstrap`生命周期钩子开始的时候,以确保所有模块都已加载,所有定时任务已声明。
配置文件在`EventEmitter`实例中,在`forRoot()`方法中传递配置对象,如下:
```TypeScript
EventEmitterModule.forRoot({
// set this to `true` to use wildcards
wildcard: false,
// the delimiter used to segment namespaces
delimiter: '.',
// set this to `true` if you want to emit the newListener event
newListener: false,
// set this to `true` if you want to emit the removeListener event
removeListener: false,
// the maximum amount of listeners that can be assigned to an event
maxListeners: 10,
// show event name in memory leak message when more than maximum amount of listeners is assigned
verboseMemoryLeak: false,
// disable throwing uncaughtException if an error event is emitted and it has no listeners
ignoreErrors: false,
});
```
### 分派事件
要分派一个事件(例如 `fire`), 使用标准构造函数注入`EventEmitter2`。
```TypeScript
constructor(private eventEmitter: EventEmitter2) {}
```
> `EventEmitter2` 从 `@nestjs/event-emitter` 包中导入。
然后在类中使用它:
```TypeScript
this.eventEmitter.emit(
'order.created',
new OrderCreatedEvent({
orderId: 1,
payload: {},
}),
);
```
### 监听事件
要声明一个事件监听器,用`@OnEvent()`装饰器装饰一个方法,装饰器在包含要执行代码的方法之前,如下:
```TypeScript
@OnEvent('order.created')
handleOrderCreatedEvent(payload: OrderCreatedEvent) {
// handle and process "OrderCreatedEvent" event
}
```
> 事件订阅器不能是请求范围的。
在简单的事件发射器中,第一个参数可以是`字符串`或者`符号`,在通配的事件发射器中,可以是`字符串|符号|数组<字符串|符号>`。第二个参数(可选的)是一个监听器的选项对象([参见这里](https://github.com/EventEmitter2/EventEmitter2#emitteronevent-listener-options-objectboolean))。
```TypeScript
@OnEvent('order.created', { async: true })
handleOrderCreatedEvent(payload: OrderCreatedEvent) {
// handle and process "OrderCreatedEvent" event
}
```
要使用命名空间或者通配符,传递`wildcard`选项到`EventEmitterModule#forRoot()`方法中。当命名空间/通配符启用时,事件可以是句点隔开的(`foo.bar`)形式或者数组(`['foo','bar']`),句点也可以配置为一个配置属性(`delimiter`)。命名空间启用时,你可以使用通配符订阅事件。
```TypeScript
@OnEvent('order.*')
handleOrderEvents(payload: OrderCreatedEvent | OrderRemovedEvent | OrderUpdatedEvent) {
// handle and process an event
}
```
注意,这样的通配符仅对一个块有效。参数`order.*`将匹配例如`order.creted`和`order.shipped`事件,但不会匹配`order.delayed.out_of_stock`。要监听这样的事件,使用`多层通配符`模式(例如`**`)。见`EventEmitter2`[文档](https://github.com/EventEmitter2/EventEmitter2#multi-level-wildcards)。
```TypeScript
@OnEvent('**')
handleEverything(payload: any) {
// handle and process an event
}
```
> `EventEmitter2`类提供了一些有用的方法来和事件交互,例如`waitFor`和`onAny`,参见[这里](https://github.com/EventEmitter2/EventEmitter2)。
## 示例[#](#example)
[此处](https://github.com/nestjs/nest/tree/master/sample/30-event-emitter)提供了一个工作示例。
- 介绍
- 概述
- 第一步
- 控制器
- 提供者
- 模块
- 中间件
- 异常过滤器
- 管道
- 守卫
- 拦截器
- 自定义装饰器
- 基础知识
- 自定义提供者
- 异步提供者
- 动态模块
- 注入作用域
- 循环依赖
- 模块参考
- 懒加载模块
- 应用上下文
- 生命周期事件
- 跨平台
- 测试
- 技术
- 数据库
- Mongo
- 配置
- 验证
- 缓存
- 序列化
- 版本控制
- 定时任务
- 队列
- 日志
- Cookies
- 事件
- 压缩
- 文件上传
- 流式处理文件
- HTTP模块
- Session(会话)
- MVC
- 性能(Fastify)
- 服务器端事件发送
- 安全
- 认证(Authentication)
- 授权(Authorization)
- 加密和散列
- Helmet
- CORS(跨域请求)
- CSRF保护
- 限速
- GraphQL
- 快速开始
- 解析器(resolvers)
- 变更(Mutations)
- 订阅(Subscriptions)
- 标量(Scalars)
- 指令(directives)
- 接口(Interfaces)
- 联合类型
- 枚举(Enums)
- 字段中间件
- 映射类型
- 插件
- 复杂性
- 扩展
- CLI插件
- 生成SDL
- 其他功能
- 联合服务
- 迁移指南
- Websocket
- 网关
- 异常过滤器
- 管道
- 守卫
- 拦截器
- 适配器
- 微服务
- 概述
- Redis
- MQTT
- NATS
- RabbitMQ
- Kafka
- gRPC
- 自定义传输器
- 异常过滤器
- 管道
- 守卫
- 拦截器
- 独立应用
- Cli
- 概述
- 工作空间
- 库
- 用法
- 脚本
- Openapi
- 介绍
- 类型和参数
- 操作
- 安全
- 映射类型
- 装饰器
- CLI插件
- 其他特性
- 迁移指南
- 秘籍
- CRUD 生成器
- 热重载
- MikroORM
- TypeORM
- Mongoose
- 序列化
- 路由模块
- Swagger
- 健康检查
- CQRS
- 文档
- Prisma
- 静态服务
- Nest Commander
- 问答
- Serverless
- HTTP 适配器
- 全局路由前缀
- 混合应用
- HTTPS 和多服务器
- 请求生命周期
- 常见错误
- 实例
- 迁移指南
- 发现
- 谁在使用Nest?