我正嘗試利用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,
}
]
我已經試過之前和之後宣佈ToasterNotificationService
的HTTP_INTERCEPTORS
您是否在導入攔截器的同一模塊中導入了託管服務? – TheUnreal
只是想同樣的問題,如果可配置爲toasterservice權的提供者,你應該有問題withouth的使用注射器 –
對不起,我應該早點把部分入原題的注入。查看編輯以查看我如何聲明'app.module.ts'的提供者。 – pjlamb12