Как зарегистрировать Angular HttpInterceptor только для субмодуля - PullRequest
0 голосов
/ 22 февраля 2019

У меня проблема с регистрацией HttpInterceptor для подмодуля в приложении Angular 7.Я хочу, чтобы только запросы, выполненные из подмодуля, были перехвачены и скорректированы.Код перехватчика выглядит следующим образом:

import {Injectable} from "@angular/core";
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from "@angular/common/http";
import {AuthService} from "../services/auth.service";
import {from, Observable} from "rxjs";
import {switchMap} from "rxjs/operators";

@Injectable()
export class AuthInterceptor implements HttpInterceptor
{
  constructor(private authService: AuthService){}

  intercept(request: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>
  {
    return from(this.authService.get()).pipe
    (

      switchMap(authData =>
      {
        const headers = request.headers.set('Authorization', 'Bearer ' + authData.jwtAccessToken);
        const requestClone = request.clone({headers});
        return next.handle(requestClone);
      })
    );
  }
}

он регистрируется в одном из подмодулей

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import {DemandDetailComponent} from "./demand-detail/demand-detail.component";
import {DemandService} from "./services/demand.service";
import {HttpClientModule, HTTP_INTERCEPTORS} from "@angular/common/http";
import {TradingRoutingModule} from "./trading-routing.module";
import {AuthInterceptor} from "../core/interceptors/http.interceptor";

@NgModule({
  declarations: [
    DemandDetailComponent
  ],
  imports: [
    CommonModule,
    HttpClientModule,
    TradingRoutingModule
  ],
  exports: [
    DemandDetailComponent
  ],
  providers: [
    DemandService,
    { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }
  ]
})
export class TradingModule { }

Перехватчик использует внутри AuthService, который создается следующим образом

import { Injectable } from '@angular/core';
import {AuthData} from "../model/authData";
import {HttpClient} from "@angular/common/http";

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  private authData : Promise<AuthData>;

  constructor(private httpClient : HttpClient)
  {
  }

  initialize()
  {
    this.authData = this.httpClient.get<AuthData>([auth-data-endpoint]).toPromise();
  }

  get()
  {
    return this.authData;
  }
}

И инициализируется в компоненте приложения

import { Component } from '@angular/core';
import {ConfigurationService} from "./core/services/configuration.service";
import {AuthService} from "./core/services/auth.service";

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {

  constructor (private configurationService: ConfigurationService, private  authService: AuthService) {}

  ngOnInit() {
    this.configurationService.initialize();
    this.authService.initialize();
  }
}

По некоторым причинам вызов инициализации authService перехватывается, что приводит к сбою приложения, так как authService еще не инициализирован.Что я тут не так делаю?

...