私は、各リクエストをインターセプトし、トークンを添付してから続けます。私はそれぞれのエラーを捕まえてステータスをチェックする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コードでデバッグ中のエラーのスクリーンショットがあります。
私はきちんとそのエラーを処理できるように、注射器が存在し、利用可能であることを確認するかどうかはわかりません。
ここ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,
},