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