angular2-jwtは、リクエストごとにhttp認証ヘッダーを自動的に含むネイティブのAngular httpクラスのAuthHttpラッパーを提供します。私のサービスでは、私は通常、私はすべてのサービスにhandleErrorのメソッドを繰り返し続けると、私はそこにあるかどうかを知りたい角での一般的なHTTPエラー処理
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);
}
のようなエラーハンドラでこの
getThings(): Observable<Thing[]> {
return this.http.get(environment.apiEndpoint + '/things')
.map(res => res.json().data)
.catch(res => this.handleError(res));
}
などのバックエンドのAPIを呼び出していますこのDRYを行う方法。すべてのhttp要求に対して汎用エラーハンドラを定義する方法はありますか?
可能であれば、毎回キャッチする必要はありません。 httpクラスを拡張して各リクエストのエラーを自動的に捕捉する方法がありますか?特殊な状況では、ケースバイケースでカスタムキャッチロジックを追加できますか?
別のファイルからメソッドをエクスポートし、各サービスでインポートすることができましたが、もっと良い方法があるはずです。ご意見ありがとうございます。
更新:私はangle2-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);
}
}
私は、angle2-jwtからAuthHttpクラスを拡張する新しいクラスを作成しました。私はAuthHttpのリクエストメソッドをオーバーライドし、エラー処理メソッドを添付しました –