Angular - HTTP-перехватчик и конфигурация, загруженные в APP_INITIALIZE
У меня есть модуль конфигурации с фабрикой, которая выполняется при инициализации приложения (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 не будет завершен?
Моя цель - создать уникальную сборку для всех сред.
0 ответов
Есть ли способ отложить инициализацию перехватчиков до тех пор, пока APP_INITIALIZER не будет завершен?
посмотрите, как сделать угловой модуль, чтобы игнорировать перехватчик http, добавленный в основной модуль.
Я лично использовал deg answer, в котором просто использовал зависимость 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;
}
надеюсь, это поможет, даже если действительно поздно