Angular - HTTP-перехватчик и конфигурация, загруженные в APP_INITIALIZE - PullRequest
0 голосов
/ 30 октября 2018

У меня есть модуль конфигурации с фабрикой, которая выполняется при инициализации приложения (APP_INITIALIZER)

export function ConfigFactory(config: ConfigService) {
    const res = () => config.load();
    return res;
}
...
{
     provide: APP_INITIALIZER,
     useFactory: ConfigFactory,
     deps: [ConfigService],
     multi: true
}

Все работает нормально, если я печатаю данные на странице / компоненте.

Проблема в том, когда я пытаюсь использовать конфигурацию в Сервисе, который вызывается из HttpInterceptor:

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

Перехватчик:

constructor(private authenticationService: AuthenticationService) {}
  intercept(request: HttpRequest<any> , next: HttpHandler): Observable<HttpEvent<any>> {

    this.authenticationService.getAccessToken().subscribe((token: string) => { this.accessToken = token.toString(); });
      this.authenticationService.getCurrentUser().subscribe((currentU: string) => { this.currentUser = currentU.toString(); });
    if (this.accessToken)  {
        request = request.clone({
        setHeaders: {
            Authorization: `Bearer ${this.accessToken}`,
            actor: this.currentUser,
    //      modulo: 'AltaActivoFijo'
        }
        });
    }
    return next.handle(request);
  }

AuthenticationService:

export class AuthenticationService implements AuthService {
    API_URL = this.configService.tokenServer;
....

Проблема в том, что configService не определен.

Есть ли способ отложить инициализацию перехватчиков до завершения APP_INITIALIZER?

Моя цель - создать уникальную сборку для всех сред.

1 Ответ

0 голосов
/ 29 января 2019

Есть ли способ отложить инициализацию перехватчиков до APP_INITIALIZER закончен?

см. Как создать угловой модуль, игнорирующий http-перехватчик, добавленный в основной модуль

Я лично использовал градусный ответ, в котором просто использовали зависимость HttpBackend вместо HttpClient в APP_INITIALIZE, потому что я использовал для получения конфигурации через вызов http. Http Call поднял Interceptor, который в основном нуждался в Конфигурации, заканчиваясь круговой зависимостью (HttpBackend не активирует перехватчики)

класс экспорта AuthenticationService реализует AuthService { API_URL = this.configService.tokenServer; ....

В вашем случае кажется, что вам также не хватает зависимости. Некоторый код отсутствует, но в модуле AuthenticationService вы, вероятно, должны объявить зависимость, например:

{ provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, deps: [AuthenticationService ], multi: true },

и инициализация переменной должна зависеть от конструктора службы:

export class AuthenticationService implements AuthService {
    API_URL = this.configService.tokenServer;
....

должно быть:

export class AuthenticationService implements AuthService {
    constructor(configService: ConfigService) {
       this.API_URL = configService.tokenServer;
    }

надеюсь, это поможет, даже если действительно поздно

...