Nodejs Nestjs事件发射器插件@nestjs/event-emitter的使用

Nodejs Nestjs事件发射器插件@nestjs/event-emitter的使用
[@nestjs](/user/nestjs)/event-emitter 是一个用于 NestJS 的事件发射器插件,它允许你轻松地创建和管理事件。这个库支持多种事件发射器实现,如 EventEmitter2kafka-node 等。下面是一个简单的使用示例,展示如何在 NestJS 应用中使用 [@nestjs](/user/nestjs)/event-emitter

安装依赖

首先,你需要安装 [@nestjs](/user/nestjs)/event-emitter 以及你喜欢的事件发射器实现。这里我们以 EventEmitter2 为例:

npm install [@nestjs](/user/nestjs)/event-emitter eventemitter2

配置模块

接下来,在你的 NestJS 模块中配置 EventEmitterModule

import { Module } from '[@nestjs](/user/nestjs)/common';
import { EventEmitterModule } from '[@nestjs](/user/nestjs)/event-emitter';

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

创建事件发射器服务

你可以创建一个服务来处理事件的发射和监听:

import { Injectable, OnModuleInit } from '[@nestjs](/user/nestjs)/common';
import { EventEmmitter } from '[@nestjs](/user/nestjs)/event-emitter';

@Injectable()
export class EventsService implements OnModuleInit {
  constructor(private readonly eventEmitter: EventEmmitter) {}

  onModuleInit() {
    // 监听自定义事件
    this.eventEmitter.on('custom-event', (data) => {
      console.log('Custom event received:', data);
    });
  }

  emitCustomEvent(data: any) {
    // 发射自定义事件
    this.eventEmitter.emit('custom-event', data);
  }
}

在控制器中使用事件发射器

最后,你可以在控制器或其他服务中注入并使用 EventsService 来发射事件:

import { Controller, Get } from '[@nestjs](/user/nestjs)/common';
import { EventsService } from './events.service';

@Controller()
export class AppController {
  constructor(private readonly eventsService: EventsService) {}

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

总结

以上就是如何在 NestJS 中使用 [@nestjs](/user/nestjs)/event-emitter 插件的基本步骤。通过这些步骤,你可以创建事件发射器,监听特定事件,并在需要时发射事件。这使得你的应用能够更加灵活地响应各种状态变化或用户操作。


3 回复

当然,让我们用点幽默来聊聊这个!

想象一下,你正在编写一个魔法森林的模拟程序。在这个森林里,每当你种下一棵树(创建一个新的树实体),森林就会举办一场派对!这就是@nestjs/event-emitter大显身手的地方。

首先,确保你的项目中安装了@nestjs/event-emitter。然后,在你的模块中导入EventEmitterModule

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

@Module({
  imports: [EventEmitterModule.forRoot()],
})
export class ForestModule {}

接下来,你需要一个事件发射器实例。在你的服务中注入它:

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

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

  onModuleInit() {
    // 森林准备好了,可以开始种树了!
  }

  plantTree(treeName: string) {
    console.log(`种下了一棵${treeName}`);
    this.eventEmitter.emit('party', treeName);
  }
}

最后,为了庆祝,我们需要监听派对事件:

import { OnEvent } from '@nestjs/event-emitter';

export class PartyService {
  @OnEvent('party')
  celebrate(treeName: string) {
    console.log(`为${treeName}举办了一场派对!`);
  }
}

现在,每当有人种下一棵树,森林里的所有生物都会知道,并且会自动举办一场派对。这不就是每个程序员梦寐以求的魔法森林吗?


@nestjs/event-emitter 是一个基于 NestJS 的事件发射器插件,它允许你在应用中实现事件驱动的设计模式。这个库利用了 eventemitter3 库,提供了一个简单的事件处理机制。

安装

首先,你需要安装 @nestjs/event-emittereventemitter3

npm install @nestjs/event-emitter eventemitter3

配置

接下来,在你的 NestJS 应用程序中配置 EventEmitterModule。通常情况下,你会在你的模块文件(例如 app.module.ts)中进行如下配置:

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

@Module({
  imports: [
    EventEmitterModule.forRoot(),
  ],
  // 其他配置...
})
export class AppModule {}

使用事件发射器

现在,你可以开始创建和使用事件了。首先,定义事件名称和处理函数。

创建事件

在一个服务中,你可以发射事件:

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

@Injectable()
export class EventsService implements OnModuleInit, OnModuleDestroy {
  constructor(@InjectEventEmitter() private readonly eventEmitter: any) {}

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

  onModuleDestroy() {
    this.eventEmitter.emit('shutdown-event', { message: 'Shutting down...' });
  }
}

订阅事件

在另一个服务或控制器中订阅这些事件:

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

@Injectable()
export class ListenerService implements OnModuleInit, OnModuleDestroy {
  constructor(@InjectEventEmitter() private readonly eventEmitter: any) {}

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

    this.eventEmitter.on('shutdown-event', (data) => {
      console.log('Received shutdown-event:', data);
    });
  }

  onModuleDestroy() {
    // 清理资源等操作
  }
}

注意事项

  • 确保事件处理器在事件被触发之前已经注册。
  • 如果你希望在某些生命周期钩子(如 onModuleInitonModuleDestroy)中处理事件,确保正确地实现这些生命周期方法。

通过这种方式,你可以轻松地在 NestJS 应用中引入事件驱动的逻辑。

@nestjs/event-emitter 插件让 NestJS 应用可以方便地进行事件驱动编程。首先,安装插件:

npm install @nestjs/event-emitter

然后,在模块中引入 EventEmitterModule

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

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

创建事件处理器并注入 @EventEmitter()

import { Component, EventEmmitter } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter';

@Component()
export class AppService {
  constructor(private eventEmitter: EventEmmitter) {}

  @OnEvent('test.event')
  handleTestEvent(payload: any) {
    console.log(payload);
  }

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

这样就完成了事件的发射和监听。

回到顶部