你能按条件导入 NestJS 模块吗
Can you import a NestJS module on condition
我正在 NestJS 中创建一个微服务。现在我想使用 RabbitMQ 将消息发送到另一个服务。
我的问题是:是否可以根据 .env
变量导入 RabbitmqModule?如:
USE_BROKER=false
。如果此变量为 false,则不导入模块?
在下面的 GraphQLModule 中导入了 RabbitMQ。
@Module({
imports: [
GraphQLFederationModule.forRoot({
autoSchemaFile: true,
context: ({ req }) => ({ req }),
}),
DatabaseModule,
AuthModule,
RabbitmqModule,
],
providers: [UserResolver, FamilyResolver, AuthResolver],
})
export class GraphQLModule {}
Rabbitmq 模块:
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 {}
好吧,我在一个小的 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 模块被部署,否则它不会部署,只有其他模块。
你能在你的项目中尝试同样的方法吗?
我认为推荐的方法是使用 NestJS 的 DynamicModule 特性。
这里解释一下:https://docs.nestjs.com/fundamentals/dynamic-modules
只需检查注册函数中的环境变量和 return 模块对象。
类似于:
@Module({})
export class GraphQLModule {
static register(): DynamicModule {
const imports = [
GraphQLFederationModule.forRoot({
autoSchemaFile: true,
context: ({ req }) => ({ req }),
}),
DatabaseModule,
AuthModule]
if (process.env.USE_BROKER) {
modules.push(RabbitmqModule)
}
return {
imports,
providers: [UserResolver, FamilyResolver, AuthResolver],
};
}
}
我正在 NestJS 中创建一个微服务。现在我想使用 RabbitMQ 将消息发送到另一个服务。
我的问题是:是否可以根据 .env
变量导入 RabbitmqModule?如:
USE_BROKER=false
。如果此变量为 false,则不导入模块?
在下面的 GraphQLModule 中导入了 RabbitMQ。
@Module({
imports: [
GraphQLFederationModule.forRoot({
autoSchemaFile: true,
context: ({ req }) => ({ req }),
}),
DatabaseModule,
AuthModule,
RabbitmqModule,
],
providers: [UserResolver, FamilyResolver, AuthResolver],
})
export class GraphQLModule {}
Rabbitmq 模块:
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 {}
好吧,我在一个小的 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 模块被部署,否则它不会部署,只有其他模块。
你能在你的项目中尝试同样的方法吗?
我认为推荐的方法是使用 NestJS 的 DynamicModule 特性。
这里解释一下:https://docs.nestjs.com/fundamentals/dynamic-modules
只需检查注册函数中的环境变量和 return 模块对象。 类似于:
@Module({})
export class GraphQLModule {
static register(): DynamicModule {
const imports = [
GraphQLFederationModule.forRoot({
autoSchemaFile: true,
context: ({ req }) => ({ req }),
}),
DatabaseModule,
AuthModule]
if (process.env.USE_BROKER) {
modules.push(RabbitmqModule)
}
return {
imports,
providers: [UserResolver, FamilyResolver, AuthResolver],
};
}
}