2017-06-12 12 views
0

バックエンドAPIにアクセスするためのすべてのhttpサービスクラスを含むDataModuleを作成しました。例:httpエラー401または403私は/ログインするか、またはトークンをリフレッシュすることができるようにしたい。angle forRootパターンを使用してコールバックをモジュールに渡す

このDataModuleをイオンアプリケーションで再利用したいので、ルータモジュールなどとのカップリングは不要else。私AppModuleでDataModuleのをインポートする際

現在、私はforRootメソッドを介して、いくつかのプリミティブな値を渡しています:

DataModule.forRoot({ 
    url: environment.apiEndpoint, 
    token() { 
    return localStorage.getItem('auth_token') 
    }, 
    onError(errors: any) { 
    console.log(this); 
    } 
}); 

を私は '/ログイン(router.navigateを呼び出す機能を持っているのonErrorコールバックを必要とします')または類似しているが、これはシンプルな設定オブジェクトであるため、私はルータが注入できるとは思わない。

私は何かを渡す方法を探していて、ngx-translate、angularitics2、ngx-restangularなどのいくつかの他の一般的なプロジェクトを見直しました。これは、DataModuleパッケージに保持されているインターフェースを実装するAuthExceptionサービスまたはそれに類するものを渡すことによって私が達成したものを達成する方法ですか?

アップデート:私は私のDataModuleのは基本的に何もしないエラー処理のためのデフォルトのサービスを持っているためである私が言及したのプロジェクトからアイデアを取ってしまってきた

。私も使用をしなければならなかった

export function ApiServiceFactory(http: Http, authException: AuthExceptionService, config: any) { 

    return new ApiService(http, authException, { 
    url: config.url, 
    token: config.token 
    }); 
} 

:参照のための私のApiServiceFactory

static forRoot(config: any): ModuleWithProviders { 

    return { 
     ngModule: DataModule, 
     providers: [ 
     config.authExceptionService || AuthExceptionService, 
     { provide: CONFIG, useValue: config }, 
     { 
      provide: ApiService, 
      useFactory: ApiServiceFactory, 
      deps: [Http, config.authExceptionService || AuthExceptionService, CONFIG] 
     }, 
     ] 
    } 
    } 

:私はその後、その後、プロバイダで使用されますforRootでアプリに固有の優れたエラー処理クラスを注入します工場への依存関係としての私のconfigオブジェクトを提供するためにInjectionTokenの:私のメインアプリから

export const CONFIG = new InjectionToken<any>('CONFIG'); 

を私は次の操作を行います

このアプローチで潜在的な問題がある場合は、誰にも聞いていただければ幸いです。私は、次のようなもので、イオンのアプリでこのモジュールを使用することができるはずです期待しています:

DataModule.forRoot({ 
     authExceptionService: MobileAppAuthExceptionService, 
     url: environment.apiEndpoint, 
     token() { 
     return storage.getItem('auth_token') // ionic uses different storage 
     } 
    }) 

答えて

0

あなたはHttpを拡張し、filter

export class MyHttp extends Http { 
    //... 
    constructor(){super()} 

    get(){ 
     super.get() 
     .filter(x => { 
     // do your logic here 
     if(x.status === 403){ 
      router.navigate(errorPage) 
      return false; 
     }    
     }) 
    } 
} 

または代わりmapを使用してスローを適用することができエラー

if (response.status === 403) { 
    throw Observable.throw(response); 
} 

と(芋、それを行うには良い方法です)リダイレクトを行うキャッチ機能を持っています。

0

これは、それぞれのプロジェクトでDataModuleを拡張し、それぞれonErrorメソッドとconstructorメソッドをオーバーライドする方法です。

export class MyDataModule extends DataModule { 

    static ForRoot(...){ 
    ... 
    } 

    constructor(...args, private router: Router){ 
    super(...args) 
    } 

    onError() { 
    this.router.navigate(errorPage); 
    } 
} 

イオンアプリケーションでは、他の方法でエラーを処理できます。

関連する問題