我需要幫助來弄清楚如何在我的攔截器刷新令牌并成功克隆并再次發(fā)出 http 請(qǐng)求后重試組件中出現(xiàn)錯(cuò)誤 401 的訂閱。在我收到錯(cuò)誤 401 后,我的攔截器獲取新令牌并調(diào)用任何端點(diǎn)。我正在取回?cái)?shù)據(jù),但問題出在我的組件中,錯(cuò)誤卡在那里,沒有任何反應(yīng),如果我刷新視圖,一切都恢復(fù)正常,但我想知道如何刷新或重試該組件訂閱以繼續(xù)401錯(cuò)誤消失后的過程。這是我在攔截器中的 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)); })); } }
在 HTTP 攔截器成功刷新令牌并執(zhí)行請(qǐng)求后重試組件中的訂閱
冉冉說
2023-03-18 11:25:12