0

I have a NestJS Backend. My AmcConfigService wraps the nestjs ConfigService and is part of a AmcServerUtilsModule that includes things that all of my backends need. I want to include the call to the KeycloakConnectModule (nest-keycloak-connect) into this shared module as well. The backends shall do their config via .env file.


The logged error when I start the backend:

ERROR [ExceptionHandler] Nest can't resolve dependencies of the KEYCLOAK_CONNECT_OPTIONS (?). Please make sure that the argument AmcConfigService at index [0] is available in the KeycloakConnectModule context.

I import the shared Module in the AppModule of each Backend

@Module({
    imports: [ AmcServerUtilsModule,... ] 
})
export class AppModule { }

The shared module

@Module({
    imports: [
        ConfigModule.forRoot({
            expandVariables: true,
            isGlobal: true
        }),
        KeycloakConnectModule.registerAsync({
            inject: [AmcConfigService],
            useFactory: async (config: AmcConfigService) => ({
                authServerUrl:  config.get("AMC_KEYCLOAK_URL"),
                realm:          config.get("AMC_KEYCLOAK_REALM"),
                clientId:       config.get("AMC_KEYCLOAK_CLIENTID"),
                secret:         config.get("AMC_KEYCLOAK_SECRET"),
            })
          })
    ],
    controllers: [],
    providers: [AmcConfigService, MailService],
    exports: [AmcConfigService, MailService]

})
export class AmcServerUtilsModule {}

I have already tried different things and found some similar problems in the web and tried their solutions but it seems like I change things in the wrong place.

I need help to find my mistake.

andymel
  • 4,538
  • 2
  • 23
  • 35

1 Answers1

0

Seems like the AmcConfigService was not available for the imports. I built an own Module that provides and exports the AmcConfigService and imported that module in front of the import of the KeycloakConnectModule. Now it works.

@Module({
    imports: [
        AmcConfigModule,
        KeycloakConnectModule.registerAsync({
            imports: [AmcServerUtilsModule],
            inject: [AmcConfigService],
            useFactory: async (config: AmcConfigService) => {
                ...
            }
          }),
        
    ],
    ...    
})
export class AmcServerUtilsModule {}

@Module({
    imports: [
        ConfigModule.forRoot({
            expandVariables: true,
        }),
    ],
    controllers: [],
    providers: [AmcConfigService],
    exports: [AmcConfigService]

})
export class AmcConfigModule { }
andymel
  • 4,538
  • 2
  • 23
  • 35