## 事件
[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?