MongooseModule.forRootAsyn c - не удается разрешить зависимости - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь использовать mon goose и динамически настраивать соединение, выполняя то же самое из nest js .com, но в моем случае службы, которые мне нужно внедрить на завод, не будут решены. вот это AppModule

@Injectable()
class Op implements MongooseOptionsFactory {
  constructor(
    @Inject(forwardRef(() => EndpointsService))
    private endpointsService: EndpointsService) {
  }

  createMongooseOptions(): MongooseModuleOptions {
    return {
      uri: this.endpointsService.loginMongoDb
    };
  }
}

@Module({
  imports: [
    MongooseModule.forRootAsync({
      useClass: Op,
      inject: [EndpointsService] // having this doesn't help either
    })
  ],
  controllers: [AppController, UserController],
  providers: [AppService, 
    EndpointsService, // is in the core module, but won't be seen
    UserService]
})
export class AppModule {
}

довольно просто (не обращайте внимания на название опа, я переместу его туда, где необходимо позже)

А вот это EndpointsService

@Injectable()
export class EndpointsService {
  private readonly _loginApi: string;
  private readonly _loginMongoDb: string;

  constructor() {
....

но ap не запускается с ошибкой

[Nest] 83842   - 03/20/2020, 10:54:26 AM   [NestFactory] Starting Nest application...
[0] [Nest] 83842   - 03/20/2020, 10:54:26 AM   [InstanceLoader] MongooseModule dependencies initialized +14ms
[0] [Nest] 83842   - 03/20/2020, 10:54:26 AM   [ExceptionHandler] Nest can't resolve dependencies of the Op (?). Please make sure that the argument EndpointsService at index [0] is available in the MongooseCoreModule context.
[0] 
[0] Potential solutions:
[0] - If EndpointsService is a provider, is it part of the current MongooseCoreModule?
[0] - If EndpointsService is exported from a separate @Module, is that module imported within MongooseCoreModule?
[0]   @Module({
[0]     imports: [ /* the Module containing EndpointsService */ ]
[0]   })
[0]  +0ms

Я также пытался использовать обычную инъекцию без forwardRef в классе Op, но результат тот же.

Чего мне не хватает?

1 Ответ

1 голос
/ 20 марта 2020

Чтобы внедрить сервис в асинхронную c конфигурацию, этот сервис или провайдер должен быть либо

1) в объеме модуля через модуль импорта 2) глобальный сервис, предоставляемый через глобальный модуль

В этом случае EndpointsService принадлежит AppModule, но AppModule не импортируется в MongooseModule для конфигурации (что было бы довольно странно, так как это большая циклическая зависимость). Вместо этого вы должны создать EndpointsModule, provides и exports EndpointsService, например:

@Module({
  providers: [EndpointsService],
  exports: [EndpointsService],
})
export class EndpointsModule

И теперь в вашей MongooseModule вы можете выполнить асинхронную c конфигурацию вот так

MongooseModule.forRootAsync({
  imports: [EndpointsService],
  useClass: Op,
})
...