Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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_Ionic Framework - Fatal编程技术网

Angular 无法将服务正确注入HttpInterceptor

Angular 无法将服务正确注入HttpInterceptor,angular,ionic-framework,Angular,Ionic Framework,我用的是离子4和角7。我正在尝试拦截HTTP请求并向标头添加令牌。问题是当我尝试从AuthService检索时,标记总是空的。我将AuthService添加到TokenInterceptor构造函数中,并注入AuthService。他们两个都不工作。我做错了什么 AuthService.ts @Injectable({ providedIn: 'root' }) export class AuthService { public token: string; public re

我用的是离子4和角7。我正在尝试拦截HTTP请求并向标头添加令牌。问题是当我尝试从
AuthService
检索时,
标记总是空的。我将
AuthService
添加到
TokenInterceptor
构造函数中,并注入
AuthService
。他们两个都不工作。我做错了什么

AuthService.ts

@Injectable({
    providedIn: 'root'
})
export class AuthService
{

  public token: string;
  public refreshToken: string;

  constructor
  (
    private http: HttpClient,
    private storage: StorageService,
  )
  {

    this.API_URL      = constants.API_URL;
    this.OAUTH_URL    = constants.AUTH_URL;

      this.storage.getTokens().then(tokens => {
        this.token            = tokens.access_token;
        this.refreshToken     = tokens.refresh_token;
      });

  }
}
令牌拦截服务

@Injectable()
  export class TokenInterceptorService implements HttpInterceptor
  {

    constructor
    (
        private auth: AuthService,
    )
    {
    }

    setHeaders(req: HttpRequest<any>, token: string): HttpRequest<any> {
        return req.clone({
          setHeaders: {
              Authorization: `Bearer ${token}`,
              'Content-Type': 'application/json',
              'Accept': 'application/json',
          }
        });
    }

    public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
    {

        console.log("token int", this.auth);    // I CAN SEE TOKEN HERE  
        console.log("token int2", this.auth.token); // TOKEN IS UNDEFINED 
        return next.handle(this.setHeaders(req, this.auth.token));
     }
}

AuthService是个坏主意。因为它是单例,所以令牌值不能同步,而Storage.getTokens是sync方法,所以您也不能确定AuthService.token在使用它之前是否已准备好。和其他,1:你不能得到新的令牌,如果它被更新;2:你不能知道用户已经注销了

所以,请在setHeaders方法中执行此操作更好。在我的资料中,类似的逻辑是:

//TokenInterceptorService
async setHeaders(url) {
  let baseHeader = {/*default values*/};
  if (url in sign-in, register, logout, home or other public api) {
    return baseHeader;
  }
  let token = {};
  await storage.getToken().then(tokenData => {
    token = tokenData;
  };
  baseHeader.token = token;
  return baseHeader;
}

首先,您似乎在auth服务(需要HttpClient)、HttpClient(需要拦截器)和拦截器(需要auth服务)之间存在循环依赖关系。但是,你能进一步解释一下“我可以在这里看到标记”的意思吗?我不知道如何解决循环依赖性。如果我记录
this.auth
我可以看到
AuthService
中的所有变量,包括
token
。对不起,在setHeaders方法中做了什么?我刚刚在那里添加了伪代码,希望对您有所帮助。
providers: [
  // .... 
  AuthService,
  APIService,
  {
    provide: HTTP_INTERCEPTORS,
    useClass: TokenInterceptorService,
    multi: true,
     deps: [AuthService],
  },
  // ....
]
//TokenInterceptorService
async setHeaders(url) {
  let baseHeader = {/*default values*/};
  if (url in sign-in, register, logout, home or other public api) {
    return baseHeader;
  }
  let token = {};
  await storage.getToken().then(tokenData => {
    token = tokenData;
  };
  baseHeader.token = token;
  return baseHeader;
}