0

角度2のカスタムhttpサービスhereの記事:httpエラーコードとリロード画面を処理する別のカスタムhttpエラーサービスを利用するこのサービスのコードは次のとおりです。私が達成しようとしています何ブートストラップフェーズ中に角2のカスタムHTTPエラーハンドラサービス注入の問題

@Injectable() 
export class HttpErrorHandler { 

    constructor(
     private apiGateway: ApiGateway 
    ) { 
     apiGateway.errors$.subscribe(
      (value: any) => { 
       console.group("HttpErrorHandler"); 
       console.log(value.status, "status code detected."); 
       console.dir(value); 
       console.groupEnd(); 
       // If the user made a request that they were not authorized 
       // to, it's possible that their session has expired. Let's 
       // refresh the page and let the server-side routing move the 
       // user to a more appropriate landing page. 
       if (value.status === 401) { 
        window.location.reload(); 
       } 
      }); 
    } 
} 

は、使用してルートをログインする401エラーのリダイレクトである:

router.navigate(['Login']); 

しかし、私はHttpErrorHandlerサービスにRouterサービスを注入するとき、私はいくつかの注入エラーが発生します。

Error: EXCEPTION: Error during instantiation of Token RouterPrimaryComponent! (Token Application Initializer -> HttpErrorHandler -> Router -> RouteRegistry -> Token RouterPrimaryComponent) 

注:HttpErrorHandler上記は、このようなアプリケーションのブートストラップフェーズで構成されています

bootstrap(AppComponent, [ 
    HTTP_PROVIDERS, 
    ROUTER_PROVIDERS, 
    ApiGateway, 
    FriendService, 
    HttpErrorHandler, 
    // 
    // Make sure our "unused" services are created via the 
    // APP_INITIALIZER token 
    // 
    provide(APP_INITIALIZER, { 
     useFactory: (httpErrorHandler) => { 
      console.info("HttpErrorHandler initialized."); 
     }, 
     deps: [HttpErrorHandler] 
    }) 
]); 

私はかなり初期のアプリケーションライフサイクルにおけるRouterサービスを注入していますかどうかわかりません。クライアント側のナビゲーションを使用できるように、HttpErrorHandlerサービスにRouterサービスを挿入する方法はありますか?

エラーを示すplnkr hereも作成しました。

答えて

2

このコードが原因である:

provide(APP_INITIALIZER, { 
    useFactory: (httpErrorHandler) => { 
     console.info("HttpErrorHandler initialized."); 
    }, 
    deps: [HttpErrorHandler] 
}) 

"ブートストラップ少なくとも一つの成分のルータを注入する前に、"

工場はAppComponent前にその依存関係としてHttpErrorHandlerRouterをインスタンス化します。

+0

ブートストラップ中にHttpErrorHandlerファクトリを初期化する必要があるときに、少なくとも1つのコンポーネントが何を意味するのか不明です。上記のplnkrであなたのアイデアを試してみてください。ありがとう – Nexus23

+0

これはあなたのplunkrからのエラーメッセージです。これは、 'Component'の前に' Router'をインスタンス化しようとしていることを示しています。 'HttpErrorHandler'を早く作成する必要はなく、必要なときに自動的に作成されます。このコードを削除するだけです。 [plunkr](http://plnkr.co/edit/GWuvkAZBawsGuLmf40JN?p=preview) – kemsky

+0

上記の問題や詳細を理解できていないと思います。初期化中にHttpErrorHandlerを削除することではありません。ブートストラップ時には、コンポーネントレベルではなく、カスタマイズしたファクトリを初期化できます。 http関連エラーを処理するためにアプリケーションレベルでHttpErrorHandlerを利用できるようにするには、問題の記事で説明したように完璧な解決策があります。私が達成したいのは、 router.navigate(['Login']); <=これはHttpErrorHandlerサービスで利用可能なルーターサービスを必要とします(これは私の問題です)。 の代わりに window.location.reload(); – Nexus23

関連する問題