将服务实例注入另一个服务

时间:2017-12-18 22:31:29

标签: angular

我有一个拦截器服务拦截每个请求,附加一个令牌,然后继续。我有一个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中调试时的错误屏幕截图。

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

我不确定如何确保进样器存在且可用,以便我可以正确处理该错误。

以下是app.module中的声明:

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

1 个答案:

答案 0 :(得分:2)

尝试更改此行:

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

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

绑定上下文(类实例)。