我正尝试利用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