拦截器不会捕获一些错误

问题描述 投票:0回答:1

我有一个问题,在我的应用程序中实现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

angular ionic3 angular-http-interceptors
1个回答
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...
    // ...
  }
 }))
}

所以这是拦截器的良好行为。您需要检查您的observable是否正好返回错误,如果您自己制作错误,请检查您是否使用observer.error(...)处理错误。

© www.soinside.com 2019 - 2024. All rights reserved.