繁体   English   中英

Angular中的通用HTTP错误处理

[英]Generic http error handling in Angular

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);
  }
}

您可以创建自定义服务CustomAuthHttp,例如AuthHTTP Wrapper。 就像包装器添加标头一样,在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('');
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM