Skip to content

Nest 广播

两个模块之间的耦合我们一般都是依赖注入,但是还有一种方法是事件监听

前置

安装

ts
npm i --save @nestjs/event-emitter

配置

  • AppModule 里面引入
ts
import { Module } from "@nestjs/common";
import { EventEmitterModule } from "@nestjs/event-emitter";
import { AaaModule } from "./modules/aaa/aaa.module";
import { BbbModule } from "./modules/bbb/bbb.module";
@Module({
  imports: [
    // 事件模块
    EventEmitterModule.forRoot(),
    // 两个模块
    AaaModule,
    BbbModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

使用

a 发送给 b

  • aaa.service.ts
ts
import { Inject, Injectable } from "@nestjs/common";
// 注入广播
import { EventEmitter2 } from "@nestjs/event-emitter";
@Injectable()
export class AaaService {
  // 注入服务

  @Inject()
  private readonly emitter: EventEmitter2;
  //查询A的时候广播
  findAll() {
    // 发送广播
    this.emitter.emit("aaa.find", { data: "查询A的时候广播" });
    return `This action returns all aaa`;
  }
}

b 接收

ts
import { Injectable } from "@nestjs/common";
// 监听广播
import { OnEvent } from "@nestjs/event-emitter";
@Injectable()
export class BbbService {
  // 注入查询
  @OnEvent("aaa.find")
  handleaaaFind(data) {
    console.log(data);
    // 再去执行其他方法比如说写日志之类的
    this.writeLog();
  }
  writeLog() {
    console.log("写日志");
  }

  findAll() {
    return `This action returns all bbb`;
  }
}

总结

  • 这样就可以不依赖注入而是通过广播的方式来进行模块之间的通信

  • 但是这种方式耦合度太高,不推荐使用