Не могу использовать пользовательский провайдер - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь ввести пользовательский провайдер согласно документации:

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 голосов
/ 05 июля 2019

Если 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 (например, forRoot и forFeature статические функции инициатора) только для создания экземпляров того, что необходимо, но это кажется быть вне этого вопроса.

...