撤回原始请求的角度为7

时间:2019-05-16 15:09:40

标签: typescript httpclient angular7 angular-http-interceptors

获取刷新令牌后,我成功进行了原始调用,但不知道如何将结果返回到原始调用函数。

我创建了一个错误拦截器来检查令牌是否已过期。并存储所有传入请求。成功刷新令牌后,应调用所有存储的请求。我已经成功达到触发原始请求的地步。我的挑战是继续从拦截器分支那里刷新令牌。这是我到目前为止所做的。.

错误拦截器

      retryWhen(incrementalRetry({
        scalingDuration: 2000,
        excludedStatusCodes: [500],
        headerAllow: request.headers.get('retry')
      })),
      catchError((err: HttpErrorResponse) => {

        if (err.error instanceof ErrorEvent) {
          errorMessage = `Error: ${err.error.message}`;
        } else {
          if (err.error instanceof ErrorEvent) {
            errorMessage = `Error: ${err.error.message}`;
          } else {
            if (err.status === 404) {
              console.log('Not Found');
            } else if (err.status === 500) {
              console.log('Server Error');
            } else if ((err.status === 401) && !AuthenticationService.gettingRefreshToken.value) {
              this.addRequestToQueue(request);
              // console.log(this.requestQueue);
              if (!AuthenticationService.gettingRefreshToken.value) {
                this.authenticationService.getRefreshToken().subscribe((res: any) => {
                  this.authenticationService.saveloggedInUser(res.accessToken, res.refreshToken);
                  AuthenticationService.gettingRefreshToken.next(false);
                  this.startRequest();
                });
              }
            } else {
              UtilityService.logout();
              // this.notificationService.showError('For security reasons, please log in again.', 'Authentication' +' Error';);
            }
          }
        }

        const error = err.error.message || err.statusText;
        if (request.headers.get('popup-error') === 'true') {
          alert('Error here');
          // this.notificationService.showError(error, 'Error');
        }
        return throwError(error);
      }));

这会撤回原始请求

private addRequestToQueue(request) {
    this.queue.push(request);
  }

  private startRequest() {
    // get next request, if any.
    if (this.queue.length > 0) {
      this.execute(this.queue[0]);
    }
  }

  private execute(requestData: HttpRequest<any>) {

    if (requestData.method.toLowerCase() === 'get') {
      this.httpClient.get(requestData.url,
        Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
        .subscribe(res => {
          this.queue.shift();
          this.startRequest();
          return res;
        });
    } else if (requestData.method.toLowerCase() === 'post') {
      this.httpClient.post(requestData.url,
        requestData.body, Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
        .subscribe(res => {
          this.queue.shift();
          this.startRequest();
          return res;
        });
    } else if (requestData.method.toLowerCase() === 'delete') {
      this.httpClient.delete(requestData.url,
        Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
        .subscribe(res => {
          this.queue.shift();
          this.startRequest();
          return res;
        });
    } else if (requestData.method.toLowerCase() === 'put') {
      this.httpClient.put(requestData.url, requestData.body,
        Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
        .subscribe(res => {
          this.queue.shift();
          this.startRequest();
          return res;
        });
    }
  }

我试图弄清楚如何使执行继续。即将结果返回给调用函数。 我一直收到令牌的原始错误消息已过期,并且当我检查网络时,实际上已经进行了呼叫。

0 个答案:

没有答案