2017-07-17 100 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我在这个答案中犯了一个小错误,我刚更新了它。 –

相关问题