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