我有Angular 5,HTTP拦截器和errorHandler的问题 .
我发送了一个http请求 . 响应可以是200或404(如果数据不存在) . 200与订阅组件完美配合 . 404是不同的,因为我从角度使用HttpInterceptor . 如果有错误,“catch error”函数会发回Observable错误但我无法从我的服务或我的组件中捕获此错误,我不知道为什么 .
test.component.ts
this.testService.findByProducId(product.id).subscribe(data => {
console.log(data);
// processing
},
err => {
console.log(err); // nothing here :(
});
test.service.ts
findByProductId(productId){
let url = this.getUrl() + "/product/" + productId;
// headers
let headers = this.setHttpHeaders();
return this.http.get(url, {headers: headers})
.map(res => res).share();
}
httpListener (interceptor)
@Injectable()
export class HttpListener implements HttpInterceptor {
countRequest: number = 0;
countResponse: number = 0;
logEnable: boolean = environment.logEnable;
logUrl: string = environment.logUrl;
constructor(
@Inject( LoaderService ) public loaderService: LoaderService,
@Inject( Router ) public router: Router) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.loaderService.show();
this.countRequest++;
return next.handle(req).pipe(
map(event => {
if (event instanceof HttpResponse) {
if (this.logEnable) {
// log data
}
}
return event;
}),
catchError(error => {
if (this.logEnable) {
// log data
}
switch(error.status) {
case 400: {
break;
}
// not authorized
case 401: {
this.router.navigate(["/"]);
break;
}
case 404: {
// my specific 404 case
if (!this.router.url.includes("/test/create")) {
}
else {
// I want to return the error to my service.
}
}
}
return Observable.throw(error);
}),
finalize(() => {
this.countResponse++;
if (this.countRequest == this.countResponse) {
this.loaderService.hide();
this.countRequest = 0;
this.countResponse = 0;
}
})
)
}
}
非常感谢你 !
2 回答
试试这个,它对我有用
component.ts
service.ts
我终于找到了问题 . 我的拦截器中的函数“catchError”似乎停止了这个过程 . 这里是好的代码(也许我可以使用“catch”函数,但我有一个错误):