拦截器无法捕获一些错误

时间:2019-03-21 13:18:57

标签: angular ionic3 angular-http-interceptors

我遇到了问题,请在我的应用程序中使用Ionic 3(角度5)拦截器来实现对我使用的api的身份验证。我通过向Bearer添加另一个字符串来强制失败,该字符串是无效的并且可以捕获错误,但是,在第一种情况下它可以工作,而在第二次调用中,它不会落入错误中(但是api响应错误403)

addAuthHeader(request) {
return request.clone({
  setHeaders: {
    "Authorization": 'Bearer ' + _.get(this.localStorageService.getAccessToken(), 'accessToken', '')
  }
 });
}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
//console.log(_.get(req, 'url', ''));
console.log(req);
return next.handle(req).pipe(catchError(err => {
  if (err instanceof HttpErrorResponse) {

    let statusError = _.get(err, 'status', 0);


    console.log(err);

    if (statusError == 401 || statusError == 403) {
      return this.authProvider.loginPartnerToken()
        .switchMap(() => {
          //console.log(req);
          req = this.addAuthHeader(req);
          //console.log(req);
          return next.handle(req);
        });
    }
  }
}))
}

我就是结果:

enter image description here

如您所见,第一个调用失败,错误为HttpErrorResponse,而第二个调用也失败,但错误为简单的HttpRequest

1 个答案:

答案 0 :(得分:0)

正如您所说,第一个错误是HttpErrorResponse的一个实例,而其他错误是HttpRequest,因此它们不会传递到您的情况中:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(catchError(err => {
  if (err instanceof HttpErrorResponse) {           // <------ This condition
    // If not HttpErrorResponse, don't go here...
    // ...
  }
 }))
}

这是拦截器的良好行为。您需要检查可观测对象是否很好地返回了错误,并且如果您自己创建了它们,请检查您是否使用observer.error(...)处理了错误。