2017-12-18 6 views
1

私は、各リクエストをインターセプトし、トークンを添付してから続けます。私はそれぞれのエラーを捕まえてステータスをチェックするcatch関数を宣言しています。 401または403の場合は、ログインページにリダイレクトします。サービスインスタンスを別のサービスにインジェクトする

export class TokenInterceptorService implements HttpInterceptor { 
    private _oidc: OidcSecurityService; 
    private _router: Router; 

    constructor(private injector: Injector) {} 

    private handleAuthError(err: HttpErrorResponse): Observable<any> { 
     if (this._router === undefined) { 
      this._router = this.injector.get(Router); 
     } 
     if (err.status === 401 || err.status === 403) { 
      this._router.navigate(['/auth/login']); 
      return Observable.throw(err.message); 
     } 
     return Observable.throw(err); 
    } 

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     let newRequest = request; 

     if (this._oidc === undefined) { 
      this._oidc = this.injector.get(OidcSecurityService); 
     } 

     if (this._oidc !== undefined) { 
      const token = this._oidc.getToken(); 
      if (token !== '') { 
       newRequest = request.clone({ 
        setHeaders: { 
         Authorization: `Bearer ${token}`, 
        }, 
       }); 
      } 
     } 

     return next.handle(newRequest).catch(this.handleAuthError); 
    } 
} 

問題がhandleAuthError機能で、this.injectorは未定義であるということですので、私はRouterサービスへの参照を挿入することはできません。ここでは、コードです。奇妙なことは、しかしインターセプト法では、this.injectorが定義されていることであると私はまた、インターセプト法からのコールバックでhandleAuthErrorコードインラインを入れてみましたOidcSecurityService

への参照を取得しますが、私は同じエラーを得ました。

ここに、VSコードでデバッグ中のエラーのスクリーンショットがあります。

TypeError: Cannot read property 'get' of undefined. ERROR

私はきちんとそのエラーを処理できるように、注射器が存在し、利用可能であることを確認するかどうかはわかりません。

ここapp.moduleでの宣言です:コンテキスト(クラスのインスタンス)をバインドする

return next.handle(newRequest).catch((err) => this.handleAuthError(err)); 

return next.handle(newRequest).catch(this.handleAuthError); 

{ 
    provide: HTTP_INTERCEPTORS, 
    useClass: TokenInterceptorService, 
    multi: true, 
}, 

答えて

2

は、この行を変更してみますが。

関連する問題