[英]Angular intercepting http errors
我想拦截每个请求和错误响应。
我已经可以拦截请求并在标头中设置令牌,并且可以拦截响应以处理刷新令牌。
但是我找不到拦截HttpErrorResponse
。
我尝试了2种方法。 一个带有显式的rxjs catchError,另一个带有某种回调:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authToken = this.auth.getToken();
if (authToken) {
req = req.clone({ headers: req.headers.set('accesstoken', authToken) });
}
return next.handle(req).pipe(
map((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
//handle refresh token
}
return event;
},
catchError((error: any) => {
if (error instanceof HttpErrorResponse) {
console.log(error);
return Observable.throw(error);
}
})));
}
如果我有一个已过期的令牌,则每个请求都将抛出HttpErrorResponse,但是此解决方案无法捕获该错误。
这是由服务返回的。 拦截器没有显示console.log()的迹象。
该服务如下所示:
public getData(): Observable<any> {
return this.http
.get<any>(url)
.pipe(
map(res => {
return res;
}),
catchError((e): Observable<any> => {
console.log(e);
const res: any = {error: e};
return of(res);
})
);
}
然后,我尝试使用“回调语法”:
return next.handle(req).pipe(
map((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
// refresh token
}
return event;
}, (error: any) => {
if (error instanceof HttpErrorResponse) {
console.log(error);
}
}));
与上述相同的结果。 控制台中没有任何内容。
我见过人们( https://medium.com/@aleixsuau/error-handling-angular-859d529fa53a )在模块中注册ErrorHandler,但是我还没有尝试过。
如何从拦截器捕获HttpErrorResponse?
编辑:
我已经尝试过ErrorHandler方法,但仍然无法获取任何日志。 然后我从服务中删除catchError
,最后记录了一些内容...
我将尝试看看这是否使拦截器正常工作...如果我必须删除所有catchError :(
我在这里做了一个可复制的示例: https : //stackblitz.com/edit/angular-m2jc9n
Angular有一个用于错误处理的钩子( https://angular.io/api/core/ErrorHandler )。
您可以创建一个服务,该服务实现有角度的ErrorHandler并实现handleError
方法,您可以在其中记录所有错误。 该错误处理程序不仅会记录HttpErrorResponse,还会记录所有错误,但是您可以过滤掉所需的错误。
@Injectable()
export class CustomErrorHandler implements ErrorHandler {
private static isHttpErrorResponse(error): error is HttpErrorResponse {
return error instanceof HttpErrorResponse;
}
handleError(error: any): void {
if (CustomErrorHandler.isHttpErrorResponse(error)) {
console.log(error);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.