rabbitmq 是否可以根据条件导入NestJS模块

6vl6ewon  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(156)

我正在NestJS中创建一个微服务,现在我想使用RabbitMQ向另一个服务发送消息。
我的问题是:是否可以基于.env变量导入RabbitmqModule?例如:USE_BROKER=false .如果该变量为false,则不导入该模块?
RabbitMQ被导入到下面的GraphQLModule中。

@Module({
  imports: [
    GraphQLFederationModule.forRoot({
      autoSchemaFile: true,
      context: ({ req }) => ({ req }),
    }),
    DatabaseModule,
    AuthModule,
    RabbitmqModule,
  ],
  providers: [UserResolver, FamilyResolver, AuthResolver],
})
export class GraphQLModule {}

家兔mq模块:

import { Global, Module } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
import { UserProducer } from './producers/user.producer';

@Global()
@Module({
  imports: [
    RabbitMQModule.forRootAsync(RabbitMQModule, {
      useFactory: async (config: ConfigService) => ({
        exchanges: [
          {
            name: config.get('rabbitMQ.exchange'),
            type: config.get('rabbitMQ.exchangeType'),
          },
        ],
        uri: config.get('rabbitMQ.url'),
        connectionInitOptions: { wait: false },
      }),
      inject: [ConfigService],
    }),
  ],
  providers: [UserProducer],
  exports: [UserProducer],
})
export class RabbitmqModule {}
iklwldmw

iklwldmw1#

我认为推荐的方法是使用NestJS中的DynamicModule特性。
在此解释如下:https://docs.nestjs.com/fundamentals/dynamic-modules
只需在register函数中检查环境变量并返回Module对象。

@Module({})
export class GraphQLModule {
  static register(): DynamicModule {
    const imports = [
      GraphQLFederationModule.forRoot({
        autoSchemaFile: true,
        context: ({ req }) => ({ req }),
      }),
      DatabaseModule,
      AuthModule]
    if (process.env.USE_BROKER) {
      imports.push(RabbitmqModule)
    }
    return {
      imports,
      providers: [UserResolver, FamilyResolver, AuthResolver],
    };
  }
}
zfciruhq

zfciruhq2#

我在一个小型的Nest项目中尝试了一个简单的变通方法,效果很好。看看:

const mymodules = [TypeOrmModule.forRoot(typeOrmConfig), UsersModule];
if (config.get('importModule')) {
    mymodules.push(PoopModule);
}
@Module({
    imports: mymodules,
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule {}

我在我的env/config中创建了一个“importModule”,并用true和false测试了它。如果为true,我的Poop模块得到部署,否则它不部署,只部署其他模块。
你能在你的项目中尝试同样的方法吗?

相关问题