I have a problem with injecting dependencies into the interceptor. I want to inject TranslateService into HttpErrorInterceptor, but I get a cyclic dependency error. When I remove the TranslateService injection it all works.
I have declared interceptor in my app.module.ts. My app module look like this:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
BrowserAnimationsModule,
CoreModule,
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient],
},
defaultLanguage: 'pl-pl'
}),
AppRoutingModule,
RouterModule,
FormsModule,
ReactiveFormsModule,
ToastrModule.forRoot()
],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: JwtInterceptor,
multi: true
},
{
provide: HTTP_INTERCEPTORS,
useClass: HttpErrorInterceptor,
multi: true,
deps: [TranslateService, ToastrService]
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
In AppModule I have imported CoreModule, where I have a folder with interceptors and my CoreModule looks like this:
@NgModule({
declarations: [],
imports: [
CommonModule
],
providers: [
CookieService,
NoAuthGuard,
AuthGuard
]
})
export class CoreModule { }
I put the login page in AuthModule, which looks like this:
@NgModule({
declarations: [LoginComponent, AuthComponent, ForgotPasswordComponent],
imports: [
CommonModule,
AuthRoutingModule,
RouterModule,
SharedModule
],
providers: [
AuthService
]
})
export class AuthModule { }
In Authmodule I have imported SharedModule, in which I have TranslateModule exported. And SharedModule look like this:
@NgModule({
declarations: [],
imports: [
CommonModule,
HttpClientModule,
ReactiveFormsModule
],
exports: [
TranslateModule,
ReactiveFormsModule
]
})
export class SharedModule { }
I can't find out why I have a cyclic dependency error on the login page.
My assumption is that I have imported CoreModule into AppModule, where I keep interceptors, guards and I have SharedModule, which improvises to all functional modules and I want to keep e.g. common components there.
Błąd, jaki dostaję to:
core.js:6162 ERROR Error: NG0200: Circular dependency in DI detected for InjectionToken HTTP_INTERCEPTORS. Find more at https://angular.io/errors/NG0200
at throwCyclicDependencyError (core.js:216)
at R3Injector.hydrate (core.js:11381)
at R3Injector.get (core.js:11205)
at HttpInterceptingHandler.handle (http.js:1978)
at MergeMapSubscriber.project (http.js:1114)
at MergeMapSubscriber._tryNext (mergeMap.js:44)
at MergeMapSubscriber._next (mergeMap.js:34)
at MergeMapSubscriber.next (Subscriber.js:49)
at Observable._subscribe (subscribeToArray.js:3)
at Observable._trySubscribe (Observable.js:42)
The issue you have is that for the initialization of the
TranslateModuleyou depend on theHttpClientwhich mean theHttpClientModuleneeds to be initialized first. This causes the initialization of yourHttpErrorInterceptorbecause interceptors are initialized with theHttpClientModuleinitialization. This causes a cyclic dependency since your interceptor needs theTranslateService. You can workaround this by injecting the Injector in yourHttpErrorInterceptorand then request theTranslateServiceon demand directly from the injector at the time you need it. This way you prevent the cyclic dependency on the initial initialization.Since you did not provide code for your interceptor here is a sample interceptor that uses this approach.
You still need to handle the case that getting the translate service fails since you can get an error on loading the translations.