Angular 角度RXJS使用拦截器全局处理错误
我是RXJS的新手,遇到了一个问题。我有几个HTTP调用,希望有一个全局HTTP错误拦截器。基本上,我试图捕获所有的错误响应,其中Angular 角度RXJS使用拦截器全局处理错误,angular,rxjs,Angular,Rxjs,我是RXJS的新手,遇到了一个问题。我有几个HTTP调用,希望有一个全局HTTP错误拦截器。基本上,我试图捕获所有的错误响应,其中内容类型是“problem+json”。以下是我迄今为止所做的尝试: error.interceptor.ts intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(req)
内容类型是“problem+json”
。以下是我迄今为止所做的尝试:
error.interceptor.ts
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(
tap(f => f, errorResponse => {
const {headers} = errorResponse;
if (errorResponse instanceof HttpErrorResponse && headers.get('Content-Type').includes('application/problem+json')) {
this.messageService.error(errorResponse.error.title, errorResponse.error.message);
}
return throwError(errorResponse);
})
);
}
我真正的问题是,messageService是从错误拦截器调用的,它应该在错误回调中执行console.log,但是成功回调也会执行,尽管状态代码是401
我做错了什么?提前谢谢
编辑:
我刚刚删除了拦截器,并检查了是否同时执行了成功和错误回调,结果是肯定的。首先,操作员点击它只是一个记录器,因此避免出于逻辑目的使用它
intercept(
request: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
retry(1), // optional
catchError((error) => {
console.log("TCL: HttpErrorInterceptor -> constructor -> error", error)
if (error instanceof HttpErrorResponse) {
const {headers} = error;
this.messageService.error(errorResponse.error.title,
errorResponse.error.message);
}
return next.handle(request); // go with the flow
} else {
return throwError(error);
}
return EMPTY;
}),
);
}
拦截(
请求:HttpRequest,
下一步:HttpHandler
):可见{
返回next.handle(request.pipe)(
重试(1),//可选
catchError((错误)=>{
log(“TCL:HttpErrorInterceptor->constructor->error”,error)
if(HttpErrorResponse的错误实例){
const{headers}=错误;
this.messageService.error(errorResponse.error.title,
errorResponse.error.message);
}
return next.handle(request);//按照流程进行
}否则{
返回投掷器(错误);
}
返回空;
}),
);
}
您可以添加if this condition&&headers.get('Content-Type')。includes('application/problem+json'),但angular将自动处理所有错误(400code-500code)
intercept(
request: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
retry(1), // optional
catchError((error) => {
console.log("TCL: HttpErrorInterceptor -> constructor -> error", error)
if (error instanceof HttpErrorResponse) {
const {headers} = error;
this.messageService.error(errorResponse.error.title,
errorResponse.error.message);
}
return next.handle(request); // go with the flow
} else {
return throwError(error);
}
return EMPTY;
}),
);
}