nestjs:动态全局模块

时间:2018-12-11 12:23:45

标签: typescript nestjs

official nest docs on modules解释了有关全局模块和动态模块的信息。我想知道是否可以将两种模式结合在一起?

我的用例如下:我有一个动态配置模块:

export class ConfigModule {
    static forRoot(baseConfigPath: string): DynamicModule {
        const providers = [{ provide: 'Config', useValue: configFactory(baseConfigPath) }];

        return {
            module: ConfigModule,
            providers,
            exports: providers,
        };
    }
}

这使配置模块能够依赖于传入的基本配置路径。然后,我可以将模块导入到主应用程序模块中,如下所示:

@Module({
    imports: [ConfigModule.forRoot(path.resolve(__dirname, '../config'))],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule implements NestModule {}

这很好。但是,我确实有很多其他模块(app模块的子模块,config模块的兄弟模块),在这里我还希望动态配置模块的同一实例可以注入。如果我可以将动态ConfigModule标记为全局标记,或者将其标记为另一种方法,那就太好了

我已经尝试使用ConfigModule@Global全局化,但这没有用-这是一个基于nest new创建的嵌套启动器的最小化示例存储库: https://github.com/DeX3/nest-di-playground

3 个答案:

答案 0 :(得分:1)

就像@ DeX3指出的那样,您可以使用@Global模块装饰器来实现此行为。 NestJS文档中有关模块的部分中对此进行了提及:

https://docs.nestjs.com/modules

通过查看为NestJS生态系统构建的一些第三方模块(如TypeOrm软件包),您可以查看实际操作中更深入/更真实的示例:

https://github.com/nestjs/typeorm/blob/master/lib/typeorm-core.module.ts

答案 1 :(得分:0)

最近我建立了类似您所描述的内容,我从nest/typeorm那里得到了灵感

@Module({})
export class LoggerModule {
  static forRoot(rootNamespace: string): DynamicModule {
    return {
      module: LoggerModule,
      imports: [LoggerCoreModule.forRoot(rootNamespace)],
    };
  }
}
@Global()
@Module({})
export class LoggerCoreModule {
  static forRoot(rootNamespace: string): DynamicModule {
    const namespaceProvider = {
      provide: LOGGER_ROOT_NAMESPACE,
      useValue: rootNamespace,
    };

    const loggerServiceProvider: Provider = {
      provide: LoggerService,
      useFactory: (namespace) => new LoggerService(namespace).init(),
      inject: [LOGGER_ROOT_NAMESPACE],
    };

    return {
      module: LoggerCoreModule,
      providers: [loggerServiceProvider, namespaceProvider],
      exports: [loggerServiceProvider, namespaceProvider],
    };
  }
}

然后,您将在LoggerService导出的全局范围内有一个LoggerCoreModule。您不必导出通过的配置,但是我这样做了,因为我的非核心模块有一个forFeature静态方法需要它(我没有粘贴我构建的全部内容)。

答案 2 :(得分:-1)

您忘记了在@Injectable中使用/src/config/Config.ts装饰器。

import { Injectable } from '../../node_modules/@nestjs/common';

export class Config {
  config1: string;
  config2: number;
  path: string;
}

应该是

import { Injectable } from '../../node_modules/@nestjs/common';

@Injectable() // <-----------------------
export class Config {
  config1: string;
  config2: number;
  path: string;
}