HttpInterceptor-> Service-> HttpClient循环依赖

Abd*_*ama 6 angular

所以我有我的身份验证服务AuthService,它基本上有两个方法,一个从服务器获取一个新令牌,一个用户名和一个密码,另一个检索当前存储的令牌,并在必要时刷新令牌.两者显然都依赖于HttpClient.也就是说,AuthService依赖于HttpClient.让我们记住这一点.

另一个"服务"是一个HttpInterceptor,我想拦截 AuthService 之外的所有传出请求,以添加Authorization标头(现在它变得很脏).为了构成那个头,我们需要一个令牌,我们从AuthService获得.也就是说,AuthInterceptor(我的拦截器的名称)依赖于AuthService.据我所知,HttpClient依赖于所有HTTP_INTERCEPTORS.

所以场景如下: 循环依赖

关于如何打破这个圈子的任何想法或建议?有没有办法使AuthServiceHttpClient独立于AuthInterceptor?或者这是一个坏主意?(另外第三个函数将被添加到AuthService以便将用户注销,其请求将被截获并且还将Authorization标头添加到其中)

到目前为止,我发现了一个类似的问题,但解决方法表明没有解决我的问题,现在我在引导过程中在发送任何请求之前得到无限递归.我已经处理了拦截登录和令牌刷新请求的情况,以避免这种情况,所以据我所知,这不是问题所在.这是一个概述我的代码的插件.

摘自摘录:

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  private auth: AuthService;

  constructor(inj: Injector) {
    this.auth = inj.get(AuthService);
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    // Ignore if login or refresh request
    if (req.url.includes('login')) {
      return next.handle(req);
    }

    console.log('Intercepting request...');
    return this.auth.getToken().map(token => {
      const authHeader = 'Bearer ' + token;
      const authReq = req.clone({setHeaders: {Authorization: authHeader}});
      return authReq;
    }).concatMap(newReq => next.handle(newReq));
  }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ert 7

我在使用 Angular 6.1.10 时遇到了相同或类似的问题。我只是在需要注入 HttpInterceptor 的服务中自己实例化了 HttpClient:

@Injectable()
export class AuthService {

  private http: HttpClient;

  constructor(httpBackend: HttpBackend) {
    this.http = new HttpClient(httpBackend);    
  }
}
Run Code Online (Sandbox Code Playgroud)

这打破了我的例子中的无限循环问题。


小智 6

尝试设置this.auth超时:

constructor(private injector: Injector) {
  setTimeout(() => {
    this.auth = this.injector.get(AuthService);
  })
}
Run Code Online (Sandbox Code Playgroud)

您已链接到的错误报告已更新,并提供了替代解决方法(在拦截函数中检索AuthService /而不是在构造函数中设置它):https://github.com/angular/angular/issues/18224#issuecomment -316957213


Dav*_*vid 5

更新 08/02/2018 - 角度 5.2.3

只是对此的更新:这已在 Angular 5.2.3 中修复

https://github.com/angular/angular/blob/master/CHANGELOG.md#bug-fixes-2

所以可以直接在HttpInterceptors中注入依赖于HttpClient的服务

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

    constructor(private auth: AuthService) 
Run Code Online (Sandbox Code Playgroud)