这是我的
getRefreshToken
服务方法:
getRefreshToken(): Observable<AuthResponse> {
return this.http.post<AuthResponse>(
`${environment.WEBSITE_API_NEW_URL}/${environment.NEW_REFRESH_AUTH_TOKEN_PARAM}`,
{},
{ observe: 'response' }
).pipe(
map((response) => {
if (response.status === 200) {
const data = response.body;
this.storage.set('access_token', data.accessToken);
this.storage.set('refresh_token', data.refreshToken);
this.storage.set('ttl', (Date.now() + 5 * 1000).toString());
return data;
}
throw new Error('Failed to refresh token');
}),
catchError((error) => {
console.error('Error refreshing token:', error);
// this.logout();
return throwError(error);
})
);
}
这是我在拦截器中的
handleTokenExpired
方法:
private handleTokenExpired(
req: HttpRequest<any>,
next: HttpHandler,
): Observable<HttpEvent<any>> {
return this.authService.getRefreshToken().pipe(
switchMap(() => {
const newAccessToken: string = this.storage.get('access_token');
const newRefreshToken: string = this.storage.get('refresh_token');
return next.handle(this.addToken(req, newAccessToken, newRefreshToken));
}),
catchError((error) => {
console.error('Error handling expired access token:', error);
return throwError(error);
}),
);
}
这样,来自
getRefreshToken
的 HTTP 请求不会被触发,当我用 subscribe
代替 pipe
时,我在 handleTokenExpired
中收到错误,表示订阅上不存在管道。有人可以帮忙吗?
在使用管道的设置中,handleTokenExpired方法需要来自getRefreshToken()的Observable,但由于您尝试在getRefreshToken()内使用subscribe,它不再返回Observable,这会导致错误。