2017-09-01 82 views
2

我正尝试利用Angular 4.3+中的新HTTP拦截器功能。我有拦截器工作得很好。但我想要捕捉错误并使用angular2-toaster发出吐司式的通知。我把所有的吐司功能放在一个服务中,ToasterNotificationService。但是当我尝试在拦截器内部使用该服务时,事情并没有那么好。使用服务的角度HTTP拦截器

如果我只是试图在拦截器中使用ToasterNotificationService,在构造函数中初始化它,我会得到一个错误No provider for xxx。因此,如果我从@angular/core导入Injector,在构造函数中初始化它,然后尝试手动注入ToasterNotificationService的实例,则请求会死亡。就像,它从字面上停下来,永远不会发送到服务器。这是我的intercept功能在我的拦截器的例子:

intercept (req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    console.log(req); 
    const toaster = this.injector.get(ToasterNotificationService); 


    return next.handle(req) 
     .do((ev: HttpEvent<any>) => { 
      if (ev instanceof HttpResponse) { 
       console.log('ev in the do: ', ev); 
      } 
     }) 
     .catch((response: any) => { 
      if (response instanceof HttpErrorResponse) { 
       console.log('response in the catch: ', response); 
       toaster.error('Unexpected Error', response.error.message); 
      } 

      return Observable.throw(response); 
     }); 
} 

做这件事时,对2个线工程的console.log,但随后的请求死亡。在控制台或终端中不会弹出任何错误,并且请求永远不会碰到服务器。

如果我只是注释掉引用该烤面包机的两行,请求经过服务器。

有没有人有什么我可以做些什么来绕过这个问题的任何想法?

编辑

这里是我的app.module.ts的供应商部分,在那里我宣布这两项服务:

providers: [ 
    ToasterNotificationService, 
    { 
     provide: HTTP_INTERCEPTORS, 
     useClass: ErrorInterceptorService, 
     multi: true, 
    } 
] 

我已经试过之前和之后宣布ToasterNotificationServiceHTTP_INTERCEPTORS

+1

您是否在导入拦截器的同一模块中导入了托管服务? – TheUnreal

+0

只是想同样的问题,如果可配置为toasterservice权的提供者,你应该有问题withouth的使用注射器 –

+0

对不起,我应该早点把部分入原题的注入。查看编辑以查看我如何声明'app.module.ts'的提供者。 – pjlamb12

回答

0

我想通了错误。我是从angular2-toaster导入ToasterService和我的自定义ToasterNotificationService使用它,但从来没有宣称在providers我的应用程序。一旦这样做,宣布所有三个服务,一切都按预期再次运作。