2017-07-05 10 views
0

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

答えて

1

カスタムサービスCustomAuthHttpをAuthHTTP Wrapperのように作成できます。ラッパーがヘッダーを追加するように、CustomAuthHttpでエラーをキャッチできます。次に、AuthHTTPではなくCustomAuthHttpをコードに挿入して使用します。

@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(''); 
    } 
} 
+0

私は、angle2-jwtからAuthHttpクラスを拡張する新しいクラスを作成しました。私はAuthHttpのリクエストメソッドをオーバーライドし、エラー処理メソッドを添付しました –

関連する問題