为了账号安全,请及时绑定邮箱和手机立即绑定

在 HTTP 拦截器成功刷新令牌并执行请求后重试组件中的订阅

在 HTTP 拦截器成功刷新令牌并执行请求后重试组件中的订阅

冉冉说 2023-03-18 11:25:12
我需要帮助来弄清楚如何在我的拦截器刷新令牌并成功克隆并再次发出 http 请求后重试组件中出现错误 401 的订阅。在我收到错误 401 后,我的拦截器获取新令牌并调用任何端点。我正在取回数据,但问题出在我的组件中,错误卡在那里,没有任何反应,如果我刷新视图,一切都恢复正常,但我想知道如何刷新或重试该组件订阅以继续401错误消失后的过程。这是我在拦截器中的 401 处理:intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {    return from(this.db.storage.get(TOKEN_KEY))    .pipe(      switchMap((token: any) => {      if (token) {      request = this.addToken(request, token.token);      }      return next.handle(request).pipe(catchError(error => {        if (!window.navigator.onLine) {          this.ui.showSwalErrorPrompt('Error','No internet conection!.');          return //cancel request      }else{        if (error instanceof HttpErrorResponse && error.status === 401) {          this.handle401Error(request, next,token);       } else if(error instanceof HttpErrorResponse && error.status === 500){         return throwError(error);       }else if(error instanceof HttpErrorResponse && error.status === 0){        return throwError(error);       }      }      return throwError(error);    }));  })    );  }  private addToken(request: HttpRequest<any>, token: string) {    return request.clone({      setHeaders: {        Authorization: `Bearer ${token}`      }    });  }  private handle401Error(request: HttpRequest<any>, next: HttpHandler,tokens) {    if (!this.isRefreshing) {      this.isRefreshing = true;      this.refreshTokenSubject.next(null);      return this.auth.refreshToken(tokens).pipe(        switchMap((token: any) => {          this.isRefreshing = false;          this.refreshTokenSubject.next(token.token);          this.db.removeAll('token');          this.db.storage.set('token',token);          return next.handle(this.addToken(request, token.token));        }));    } else {      return this.refreshTokenSubject.pipe(        filter(token => token != null),        take(1),        switchMap(jwt => {          return next.handle(this.addToken(request, jwt));        }));    }  }
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

只需在返回处理技巧之前添加返回即可。如果不返回,逻辑就不起作用。

if (error instanceof HttpErrorResponse && error.status === 401) { 
         return this.handle401Error(request, next,token);


查看完整回答
反对 回复 2023-03-18
  • 1 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号