阻止在订阅块之后向用户显示错误

时间:2019-03-21 20:00:27

标签: angular typescript error-handling

我是Angular的新手,我建立了小型PoC,但是在我搬家之前我缺少一些要点,有什么办法可以使此代码同步? 我的意思是,直到您没有调用REST API的User方法的响应,我在ErrorInterceptor中想要的是...

一旦某人正确登录到网络,他便被移至主页,并且令牌(用户对象)存储在localStorage中,因此在用户第二天回来后,REST令牌已经过期,因此我实现了刷新令牌方法,一旦有人导航到任何页面,他基本上都会在后台通过REST API获取数据,为此,他需要一个新令牌,因此方法 this.userService.refreshToken(currentUser)刷新令牌并更新为用户存储的令牌,此代码中的所有内容看起来都很不错,但我需要以某种方式防止Error不会显示给用户(因为令牌在此期间被刷新,下次调用也可以正常工作)。

如果我想在订阅块中返回“ throwError”,则根本不起作用,它最终会返回错误,因此如果刷新令牌并且有机会限制不显示错误,现在有效吗?

import {Injectable} from '@angular/core';
import {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor} from '@angular/common/http';
import {Observable, throwError} from 'rxjs';
import {catchError, first, tap} from 'rxjs/operators';

import {AuthenticationService, UserService} from '@/_services';
import {rejects} from "assert";
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
  constructor(private authenticationService: AuthenticationService, private userService: UserService) {
  }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    let currentUser = this.authenticationService.currentUserValue;
    return next.handle(request).pipe(
      catchError(err => {
          console.log(JSON.stringify(err));
          if (err.status === 401 && !location.pathname.includes('/login')) {
            if (err.error.message && err.error.message.toString().includes("Not authorized!") && currentUser.refreshToken) {
              this.userService.refreshToken(currentUser)
                .pipe(first())
                .subscribe(
                  data => {
                    currentUser.token = data['token'];
                    return next.handle(request);
                  }, error => {
                    this.authenticationService.logout();
                    location.reload(true);//
                  }
                )
            }
          }
          return throwError(JSON.stringify(err.error));
        }
      ))
  }
}

0 个答案:

没有答案