Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度RXJS使用拦截器全局处理错误_Angular_Rxjs - Fatal编程技术网

Angular 角度RXJS使用拦截器全局处理错误

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)

我是RXJS的新手,遇到了一个问题。我有几个HTTP调用,希望有一个全局HTTP错误拦截器。基本上,我试图捕获所有的错误响应,其中
内容类型是
“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;
            }),
        );
    }