猿问

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

我需要帮助来弄清楚如何在我的拦截器刷新令牌并成功克隆并再次发出 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));

        }));

    }

  }


冉冉说
浏览 100回答 1
1回答

温温酱

只需在返回处理技巧之前添加返回即可。如果不返回,逻辑就不起作用。if&nbsp;(error&nbsp;instanceof&nbsp;HttpErrorResponse&nbsp;&&&nbsp;error.status&nbsp;===&nbsp;401)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.handle401Error(request,&nbsp;next,token);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答