【问题标题】:Generic http error handling in AngularAngular 中的通用 http 错误处理
【发布时间】:2017-12-09 06:55:42
【问题描述】:

angular2-jwt 为原生 Angular http 类提供了一个 AuthHttp 包装器,该包装器自动在每个请求中包含 http 授权标头。在我的服务中,我通常会调用这样的后端 api

  getThings(): Observable<Thing[]> {
    return this.http.get(environment.apiEndpoint + '/things')
                    .map(res => res.json().data)
                    .catch(res => this.handleError(res));
  }

使用类似的错误处理程序

private handleError(error: Response | any) {
  let errMsg: string;
  if (error instanceof Response) {
    const body = error.json() || '';
    const err = body.error || JSON.stringify(body);
    errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
  } else {
    errMsg = error.message ? error.message : error.toString();
  }
  // If JWT is expired open a new window to log in again
  if (errMsg.indexOf('No JWT present or has expired') !== -1) {
    window.open(environment.apiEndpoint + '/loginToApp?expired', '_blank', 'height=570,width=520');
  }
  console.error(error);
  return Observable.throw(errMsg);
}

我一直在我的所有服务中重复 handleError 方法,我想知道是否有办法使这个 DRY。有没有办法为所有 http 请求定义一个通用错误处理程序?

如果可能,我想避免每次都调用 catch。有没有办法扩展 http 类以自动捕获每个请求的错误,然后在特殊情况下我可以根据具体情况添加自定义捕获逻辑?

我可以从另一个文件中导出该方法并将其导入我的每个服务中,但我认为必须有更好的方法。感谢您的任何建议。

更新:我最终从 angular2-jwt 扩展了 AuthHttp 类。

import { Http, RequestOptions, Response, Request, RequestOptionsArgs } from '@angular/http';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

import { AuthHttp, AuthConfig } from 'angular2-jwt';

export class ApiHttp extends AuthHttp { 

  public request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    return super.request(url, options).catch(res => this.handleError(res));
  }

  private handleError(error: Response | any) {
    // error handling then rethrow the error
    return Observable.throw(error);
  }
}

【问题讨论】:

    标签: angular http error-handling dry angular2-jwt


    【解决方案1】:

    您可以像 AuthHTTP Wrapper 一样创建自定义服务 CustomAuthHttp。就像包装器添加标头一样,在 CustomAuthHttp 中您可以捕获错误。然后在您的代码中注入 CustomAuthHttp 而不是 AuthHTTP 并使用。

    @Injectable()
    export class CustomAuthHttp {
    
      constructor(private http: AuthHttpWrapper) { }
    
      get(url: string) {
        return this.http.get(url)
          .catch(res => this.handleError(res));
      }
    
      private handleError(error: Response | any) {
        // your code
        return Observable.throw('');
      }
    }
    

    【讨论】:

    • 我最终创建了一个从 angular2-jwt 扩展 AuthHttp 类的新类。然后我覆盖了 AuthHttp 的请求方法并附加了我的错误处理方法
    猜你喜欢
    • 2018-11-30
    • 2012-11-16
    • 2016-07-12
    • 2017-12-16
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多