获取刷新令牌后,我成功进行了原始调用,但不知道如何将结果返回到原始调用函数。
我创建了一个错误拦截器来检查令牌是否已过期。并存储所有传入请求。成功刷新令牌后,应调用所有存储的请求。我已经成功达到触发原始请求的地步。我的挑战是继续从拦截器分支那里刷新令牌。这是我到目前为止所做的。.
错误拦截器
retryWhen(incrementalRetry({
scalingDuration: 2000,
excludedStatusCodes: [500],
headerAllow: request.headers.get('retry')
})),
catchError((err: HttpErrorResponse) => {
if (err.error instanceof ErrorEvent) {
errorMessage = `Error: ${err.error.message}`;
} else {
if (err.error instanceof ErrorEvent) {
errorMessage = `Error: ${err.error.message}`;
} else {
if (err.status === 404) {
console.log('Not Found');
} else if (err.status === 500) {
console.log('Server Error');
} else if ((err.status === 401) && !AuthenticationService.gettingRefreshToken.value) {
this.addRequestToQueue(request);
// console.log(this.requestQueue);
if (!AuthenticationService.gettingRefreshToken.value) {
this.authenticationService.getRefreshToken().subscribe((res: any) => {
this.authenticationService.saveloggedInUser(res.accessToken, res.refreshToken);
AuthenticationService.gettingRefreshToken.next(false);
this.startRequest();
});
}
} else {
UtilityService.logout();
// this.notificationService.showError('For security reasons, please log in again.', 'Authentication' +' Error';);
}
}
}
const error = err.error.message || err.statusText;
if (request.headers.get('popup-error') === 'true') {
alert('Error here');
// this.notificationService.showError(error, 'Error');
}
return throwError(error);
}));
这会撤回原始请求
private addRequestToQueue(request) {
this.queue.push(request);
}
private startRequest() {
// get next request, if any.
if (this.queue.length > 0) {
this.execute(this.queue[0]);
}
}
private execute(requestData: HttpRequest<any>) {
if (requestData.method.toLowerCase() === 'get') {
this.httpClient.get(requestData.url,
Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
.subscribe(res => {
this.queue.shift();
this.startRequest();
return res;
});
} else if (requestData.method.toLowerCase() === 'post') {
this.httpClient.post(requestData.url,
requestData.body, Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
.subscribe(res => {
this.queue.shift();
this.startRequest();
return res;
});
} else if (requestData.method.toLowerCase() === 'delete') {
this.httpClient.delete(requestData.url,
Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
.subscribe(res => {
this.queue.shift();
this.startRequest();
return res;
});
} else if (requestData.method.toLowerCase() === 'put') {
this.httpClient.put(requestData.url, requestData.body,
Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
.subscribe(res => {
this.queue.shift();
this.startRequest();
return res;
});
}
}
我试图弄清楚如何使执行继续。即将结果返回给调用函数。 我一直收到令牌的原始错误消息已过期,并且当我检查网络时,实际上已经进行了呼叫。