使用带有 Nestjs 问题的事件发射器调用 1 函数两次

问题描述 投票:0回答:2

这是我的代码: 事件发射器.module.ts

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

@Module({
  imports: [EventEmitterModule.forRoot()],
  providers: [EmitterService],
  exports: [EmitterService],
})
export class EmitterModule {}

事件发射器.service.ts

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

@Injectable()
export class EmitterService {
  constructor(private eventEmitter: EventEmitter2) {}

  emitEvent() {
    console.log('first');
    this.eventEmitter.emit('msg.sent');
  }

  @OnEvent('msg.sent')
  listentToEvent() {
    console.log('second');
  }
}

测试.controller.ts

import { Controller, Get } from '@nestjs/common';
import { EmitterService } from '../event-emitter/event-emitter.service';

@Controller('test')
export class TestController {
  constructor(private readonly emitterService: EmitterService) {}

  @Get('/event-emitter')
  async testEventEmitter() {
    this.emitterService.emitEvent();
  }
}

当我使用事件发射器服务时,有 2 个用于模块的选项,每个选项记录不同的结果:

第一个选项: 测试.module.ts

import { Module } from '@nestjs/common';
import { EmitterModule } from '../event-emitter/event-emitter.module';
import { EmitterService } from '../event-emitter/event-emitter.service';
import { TestController } from './test.controller';

@Module({
  imports: [],
  controllers: [TestController],
  providers: [EmitterService],
  exports: [],
})
export class TestModule {}

第一个结果:

第二个选项: 测试.module.ts

import { Module } from '@nestjs/common';
import { EmitterModule } from '../event-emitter/event-emitter.module';
import { EmitterService } from '../event-emitter/event-emitter.service';
import { TestController } from './test.controller';

@Module({
  imports: [EmitterModule],
  controllers: [TestController],
  providers: [],
  exports: [],
})
export class TestModule {}

第二个结果:

我不知道为什么第一个选项调用listintToEvent() 2次。感谢您的关注。

nestjs eventemitter
2个回答
4
投票

您需要将事件处理函数放在不同的服务文件中。如果您的事件是在一个服务文件中发出的,则 @OnEvent 装饰器方法的处理程序应该位于另一个文件中。如果它们在同一个文件中,它将表现异常。正如 Nest js 文档中提到的:


0
投票

这可能对某人有帮助: 我的服务不在请求范围内,但事件处理程序被调用两次! 我发现该服务被启动了两次,这是因为我在提供程序的数组中提到了两次,一次使用字符串引用,一次使用类引用

{
      provide: 'IStoreBalanceRepository',
      useClass: StoreBalanceRepository,
},
     StoreBalanceRepository

所以订阅完成了两次! 希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.