不能使用自定义提供程序

时间:2019-07-05 08:21:49

标签: nestjs

我正在尝试根据文档注入自定义提供程序:

https://docs.nestjs.com/fundamentals/custom-providers

我的服务:

@Injectable({scope: Scope.REQUEST})
export class ReportService implements OnModuleInit {
  private readonly reportRepository: Repository<Report>;

  constructor(
    public config: ConfigService,
    private readonly moduleRef: ModuleRef,
    @Inject('CONNECTION') connection: Connection,
  ) {
    console.log(connection);
  }
  ...

app.module.ts

const connectionProvider = {
  provide: 'CONNECTION',
  useValue: connection,
};

@Module({
  imports: [
    ReportModule,
    ...
  ],
  providers: [connectionProvider],
  controllers: [AppController],
})
export class AppModule implements NestModule {

这样做会导致:

Error: Nest can't resolve dependencies of the ReportService (ConfigService, ModuleRef, ?). Please make sure that the argument at index [2] is available in the ReportModule context.

我想念什么?

1 个答案:

答案 0 :(得分:0)

如果provider在定义它的模块之外可用,则需要将其添加到模块定义(exports)的app.module中。使用它的另一个模块(report.module)需要将该模块添加到其imports定义中。

app.module.ts

const connectionProvider = {
  provide: 'CONNECTION',
  useValue: Connection,
};

@Module({
  imports: [
    ReportModule,
    ...
  ],
  providers: [connectionProvider],
  exports: ['CONNECTION'],
  controllers: [AppController],
})
export class AppModule implements NestModule {}

report.module.ts

@Module({
  imports: [
    AppModule
  ],
  providers: [],
  controllers: [],
})
export class ReportModule implements NestModule {}

在您的情况下,这会产生循环依赖关系,需要解决。

由于app.module似乎是您的核心模块,您可以将其设为global,但仍需要导出提供程序。

或者,我发现最好不要在app.module中定义任何提供程序,而只使用DynamicModule(例如forRootforFeature静态启动器函数)作为提供程序实例化所需的内容,但这似乎不在此问题范围内。