2017-07-17 116 views
0

我試圖實現使用新的HttpClient在角4.3的HTTP攔截,但我不斷收到錯誤:錯誤:沒有提供程序AuthInterceptor

ERROR Error: Uncaught (in promise): Error: No provider for AuthInterceptor!

這是我在我的app.module .TS:

@NgModule({ 
bootstrap: [AppComponent], 
declarations: [ 
    AppComponent, 
    LoginComponent, 
    NotFoundComponent 
], 
imports: [ 
    RouterModule.forRoot([ 
     { path: "", redirectTo: "login", pathMatch: "full" }, 
     { path: "login", component: LoginComponent }, 
     { path: "**", component: NotFoundComponent } 
    ]), 

    NgbModule.forRoot(), 
    BrowserAnimationsModule, 
    HttpClientModule, 
], 
providers: [ 
    AuthenticationService, 
    { provide: HTTP_INTERCEPTORS, useExisting: AuthInterceptor, multi: true }, 
] 
}; 

我看着所有錯誤「無提供CustomService」的文章,他們都指確保該服務被添加到供應商名單中app.module我認爲我已經完成了。

有沒有人有任何其他想法?

謝謝。

+0

你爲什麼使用'useExisting'?這是爲了混疊現有的依賴性令牌。除非在AuthInterceptor標記下已經提供了某些東西,否則它會失敗。嘗試添加'AuthInterceptor'到你的'providers'屬性。 –

+1

啊,你說得對。我遵循一個關於實現攔截器的教程,但沒有意識到useExisting意味着它必須已經存在。如果您提交您的評論作爲問題的答案,我很樂意將其標記爲正確的答案。 –

回答

2

TL; DR:變化useExistinguseClass添加AuthInterceptorproviders財產,如果你想別的地方直接注入它。

提供者配置可能有錯誤。具體而言,您已將AuthInterceptoruseExisting供應商選項一起註冊。

這是爲另一個現有的依賴注入提供程序在新標記下注冊一個別名。

這樣做的目的是通過令牌HTTP_INTERCEPTORS提供已經提供的AuthInterceptor服務。

因此,除非您的應用程序*導入的其他一些ngModule已經在標記AuthInterceptor下提供了一些東西,否則它將失敗。

要解決手頭的問題,改變useExistinguseClass,如果AuthInterceptor是一類,否則根據需要將其更改爲useValueuseFactory。 另一種選擇是將AuthInterceptor添加到您的providers屬性中,如果您想直接將其注入到其他位置,則可以執行此操作。

* 注意,通過進口的所有供應商熱切加載ngModules合併爲一個共享的,全球依賴注入容器。

+0

@LamboJayapalan我在這個答案中犯了一個小錯誤,我剛更新了它。 –

相關問題