我有一个拦截器服务拦截每个请求,附加一个令牌,然后继续。我有一个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
被定义并获得对OidcSecurityService
的引用
我还尝试将handleAuthError
代码内联到拦截方法的回调中,但我得到了同样的错误。
这是VS Code中调试时的错误屏幕截图。
我不确定如何确保进样器存在且可用,以便我可以正确处理该错误。
以下是app.module
中的声明:
{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptorService,
multi: true,
},
答案 0 :(得分:2)
尝试更改此行:
return next.handle(newRequest).catch(this.handleAuthError);
到
return next.handle(newRequest).catch((err) => this.handleAuthError(err));
绑定上下文(类实例)。