【问题标题】:Make HTTP request from Interceptor从拦截器发出 HTTP 请求
【发布时间】:2023-03-18 06:45:01
【问题描述】:

Objective- 访问令牌包含在请求中,以查看用户特定的内容,如个人资料、订单等。现在,当从 Angular 应用程序请求此类资源时,我正在检查访问令牌的有效性以及它是否已过期然后从我的后端返回特定代码 - ERR_TKN_EXP,在拦截器中,我检查此错误代码并因此希望触发 http 请求以在后端生成新令牌。这里的 HTTP 请求没有从 Interceptor 初始化。

我尝试过的:

拦截器:

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");

    });
  }

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

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

谢谢。

【问题讨论】:

  • 您没有订阅.refreshToken() 方法,因此它不会运行。只需写return this.authService.refreshToken(); 就可以了。
  • 太好了,谢谢菲利普。你的回答解决了我的问题。
  • 不客气。我会将其添加为官方答案,以便您接受。

标签: angular interceptor


【解决方案1】:

refreshToken 方法实际上确实返回了一个 Observable,但您没有向它返回 subscribe,因此它不会运行。

更改您的拦截器,使其还进一步传递refreshToken 的返回值。然后 Angular 将在内部订阅拦截器的返回值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多