2017-09-01 81 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我的應用程序。一旦這樣做,宣佈所有三個服務,一切都按預期再次運作。