Nodejs Nestjs事件发射器event-emitter的使用

Nodejs Nestjs事件发射器event-emitter的使用
在NestJS中使用@nestjs/event-emitter模块可以非常方便地处理事件驱动的架构。下面是一个简单的示例,展示如何设置和使用事件发射器。

1. 安装必要的依赖

首先,你需要安装@nestjs/event-emitter和一个事件发射库,比如socket.ioredis等。

npm install @nestjs/event-emitter socket.io-adapter

2. 配置模块

在你的应用模块(通常是AppModule)中,导入EventEmitterModule并配置适配器:

import { Module } from '@nestjs/common';
import { EventEmitterModule } from '@nestjs/event-emitter';

@Module({
  imports: [
    EventEmitterModule.forRoot({
      // 这里可以配置你的事件发射器适配器
      // 例如,如果你使用socket.io
      adapter: require('@nestjs/event-emitter/socket.io-adapter').IoAdapter,
    }),
  ],
})
export class AppModule {}

3. 创建事件发射器服务

接下来,创建一个服务来发射事件:

import { Injectable, OnModuleInit } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter';

@Injectable()
export class EventsService implements OnModuleInit {
  onModuleInit() {
    // 在模块初始化时订阅事件
    this.eventEmitter.on('test-event', (data) => {
      console.log('Received event with data:', data);
    });
  }

  constructor(private readonly eventEmitter: EventEmitter2) {}

  emitEvent(data: any) {
    this.eventEmitter.emit('test-event', data);
  }
}

4. 使用事件发射器

在任何需要的地方注入EventsService并调用emitEvent方法:

import { Controller, Get } from '@nestjs/common';
import { EventsService } from './events.service';

@Controller('events')
export class EventsController {
  constructor(private readonly eventsService: EventsService) {}

  @Get('emit')
  async emitTestEvent() {
    this.eventsService.emitEvent({ message: 'Hello, world!' });
    return { message: 'Event emitted' };
  }
}

5. 接收事件

你也可以在其他服务或控制器中监听相同的事件:

import { Injectable, OnEvent } from '@nestjs/common';

@Injectable()
export class AnotherService {
  @OnEvent('test-event')
  handleTestEvent(data: any) {
    console.log('Handling event with data:', data);
  }
}

以上就是如何在NestJS中使用事件发射器的基本步骤。你可以根据自己的需求选择不同的事件发射库,并调整配置以适应你的应用场景。


3 回复

当然,让我用一种轻松的方式给你解释一下NestJS中的事件发射器(EventEmitter)吧!

想象一下,你在做一个超级英雄应用。你的超级英雄们需要能够发射“事件”,比如“拯救市民”或“打败坏蛋”。在NestJS中,你可以使用@nestjs/event-emitter模块来实现这个功能。

首先,你需要安装它:

npm install @nestjs/event-emitter

然后,在你的超级英雄服务中,注入EventEmitter2

import { Injectable, OnModuleInit } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';

@Injectable()
export class HeroService implements OnModuleInit {
  constructor(private readonly eventEmitter: EventEmitter2) {}

  onModuleInit() {
    // 当模块初始化时,可以订阅事件
    this.eventEmitter.on('hero-saved', (eventData) => {
      console.log(`Hero saved someone! Event data: ${eventData}`);
    });
  }

  saveCitizen(citizenId: string) {
    // 英雄拯救市民
    console.log(`Hero saved citizen with ID: ${citizenId}`);
    // 发射事件
    this.eventEmitter.emit('hero-saved', `Citizen ${citizenId} was saved`);
  }
}

这样,每当英雄拯救一个市民时,都会发射一个hero-saved事件,并附带一些信息。其他部分可以监听这个事件并作出相应的反应,就像超级英雄世界里的连锁反应一样!

希望这能帮到你,如果你还有任何疑问,欢迎继续提问!


NestJS 提供了强大的依赖注入系统和模块化架构,它还集成了 @nestjs/event-emitter 模块,使得事件驱动编程变得更加容易。以下是如何在 NestJS 应用中使用事件发射器的基本步骤。

1. 安装必要的包

首先,你需要安装 @nestjs/event-emitter 包:

npm install @nestjs/event-emitter

如果你还没有使用 rxjs(默认情况下 NestJS 已经包含了这个库),你也可能需要手动安装它:

npm install rxjs

2. 创建事件和事件处理器

定义一个事件名称,并创建相应的事件处理器。

事件接口

// src/events/interfaces/my-event.interface.ts
export interface MyEvent {
  message: string;
}

事件处理器

// src/events/event.handler.ts
import { Injectable } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter';

@Injectable()
export class MyEventHandler {
  @OnEvent('my.event')
  handle(event: MyEvent) {
    console.log('Event received:', event.message);
  }
}

3. 在服务中触发事件

在你的服务中,你可以通过注入 EventEmitter2 来触发事件。

// src/app.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';

@Injectable()
export class AppService implements OnModuleInit {
  constructor(private readonly eventEmitter: EventEmitter2) {}

  onModuleInit() {
    // 你也可以在这里注册事件监听器
  }

  triggerMyEvent(message: string) {
    this.eventEmitter.emit('my.event', { message });
  }
}

4. 配置模块

确保在你的模块中启用事件发射器。

// src/app.module.ts
import { Module } from '@nestjs/common';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { AppService } from './app.service';
import { MyEventHandler } from './events/event.handler';

@Module({
  imports: [EventEmitterModule.forRoot()],
  providers: [AppService, MyEventHandler],
})
export class AppModule {}

5. 使用事件

最后,在控制器或其他服务中调用 triggerMyEvent 方法来触发事件。

// src/app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  async triggerEvent() {
    this.appService.triggerMyEvent('Hello, World!');
    return { message: 'Event triggered' };
  }
}

以上就是如何在 NestJS 中使用事件发射器的基本示例。这种模式非常适合解耦应用程序的不同部分,特别是在处理异步操作或多个组件需要响应相同事件时。

NestJS中的事件发射器@nestjs/event-emitter模块可以帮助你实现异步事件处理。首先安装@nestjs/event-emitterasync库。然后,在你的服务中注入EventEmitter2,使用emit方法触发事件,使用on方法监听事件。

例如:

import { Injectable, OnModuleInit } from '@nestjs/common';
import { InjectEventEmitter } from '@nestjs/event-emitter';
import { EventEmitter2 } from '@nestjs/event-emitter';

@Injectable()
export class AppService implements OnModuleInit {
  constructor(@InjectEventEmitter() private readonly eventEmitter: EventEmitter2) {}

  onModuleInit() {
    this.eventEmitter.on('test-event', (data) => console.log(data));
  }

  emitEvent() {
    this.eventEmitter.emit('test-event', { message: 'Hello, World!' });
  }
}

这样就实现了简单的事件监听与触发。

回到顶部