从拦截器发出 HTTP 请求

Make HTTP request from Interceptor

Objective- 访问令牌包含在查看用户特定内容(如个人资料、订单等)的请求中。现在,当从 angular 应用程序请求此类资源时,我正在检查对于访问令牌的有效性,如果它已过期,则 return 特定代码 - ERR_TKN_EXP 来自我的后端,在拦截器中,我检查此错误代码并因此想要触发 http 请求以生成后端的新令牌。这里的 HTTP 请求不是从拦截器初始化的。

我尝试过的:

拦截器:

return next.handle(request).pipe(catchError(err => {

      //const error = err.error.message || err.statusText;

      const resError = err.error;

      // Handle token expired case to generate a new token
      if (err.status === 401 && resError.error.code == 'ERR_TKN_EXP') {
        this.authService.refreshToken();


      }
  }))

AuthService - refreshToken 函数。

 refreshToken(){

    this.generate_ac_tkn = true;

    let refTokenParams = {
      'auth-token' : this.ac_tkn,

    }

    alert("refreshToken");

    return  this.http.post(API_END_POINT + 'refresh-token', refTokenParams, {withCredentials: true})
    .map((res: Response) => {
      alert("refreshToken-Call");

    });
  }

按照上面的代码,当服务器returns ERR_TKN_EXP代码时,拦截器检查这段代码并相应地调用函数来刷新令牌。当我试图追踪问题时,“refreshToken”收到警报,但看不到“refreshToken-Call”的警报框,这意味着 http post 请求没有发生。

谁能指出这里出了什么问题。

谢谢。

refreshToken 方法实际上 return 和 Observable,但您没有 subscribe 它,因此它不会 运行。

更改您的拦截器,使其也进一步传递 refreshToken 的 return 值。 Angular 将在内部订阅拦截器的 return 值。

return next.handle(request).pipe(catchError(err => {
  const resError = err.error;

  if (err.status === 401 && resError.error.code == 'ERR_TKN_EXP') {
    return this.authService.refreshToken();
  }

  return EMPTY;
}))