Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何仅为子模块注册HttpInterceptor_Angular_Angular Httpclient_Angular Http Interceptors - Fatal编程技术网

Angular 如何仅为子模块注册HttpInterceptor

Angular 如何仅为子模块注册HttpInterceptor,angular,angular-httpclient,angular-http-interceptors,Angular,Angular Httpclient,Angular Http Interceptors,我在Angular 7应用程序中为子模块注册HttpInterceptor时遇到问题。我的意图是只截获和调整从子模块执行的请求。拦截器的代码如下所示 import {Injectable} from "@angular/core"; import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from "@angular/common/http"; import {AuthService} from "../services/aut

我在Angular 7应用程序中为子模块注册HttpInterceptor时遇到问题。我的意图是只截获和调整从子模块执行的请求。拦截器的代码如下所示

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);
      })
    );
  }
}
拦截器在一个
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;
  }
}

由于某些原因,authService的初始化调用被截获,这使得应用程序在authService尚未初始化时失败。我在这里做错了什么?

导入核心模块时应该设置HTTP拦截器(我假设在app.module.ts中是这样),否则它将无法工作,主要是因为在尝试设置拦截器时HTTPClientModule已经启动

有关更多详细的解释,请查看

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();
  }
}