【发布时间】:2021-02-06 09:37:18
【问题描述】:
我想拦截 http 响应,尤其是在出现 401 之类的错误时。所以我在 toPromise 之后使用了 catch 块。但我在下面收到错误。
错误:键入'void | HttpSentEvent | HttpHeader 响应 | HttpProgressEvent |响应 | HttpUserEvent' 不可分配给类型 'HttpEvent'。 类型“void”不可分配给类型“HttpEvent”。
这是我的拦截器代码。你能说出代码有什么问题并给出解决方案吗?谢谢
import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpEvent,
HttpResponse,
HttpErrorResponse,
HttpRequest,
HttpHandler,
HttpHeaders
} from '@angular/common/http';
import { TokenService } from '../services/token.service';
import { environment } from 'src/environments/environment';
import { observable, Observable, throwError } from 'rxjs';
import { fromPromise } from 'rxjs/internal-compatibility';
@Injectable()
export class CustomHttpInterceptor implements HttpInterceptor {
constructor(private tokenService: TokenService,
private authService: AuthService) {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return fromPromise(this.handleAccess(request, next));
}
private async handleAccess(request: HttpRequest<any>, next: HttpHandler): Promise<HttpEvent<any>> {
const token = await this.tokenService.getToken();
const lang = localStorage.getItem('pref_lang');
let changedRequest = request;
const headerSettings: { [name: string]: string | string[]; } = {};
for (const key of request.headers.keys()) {
headerSettings[key] = request.headers.getAll(key);
}
if (token) {
headerSettings['Authorization'] = 'Bearer ' + token;
}
headerSettings['Content-Type'] = 'application/json';
headerSettings['Accept-Language'] = lang;
const newHeader = new HttpHeaders(headerSettings);
changedRequest = request.clone({
headers: newHeader
});
return next.handle(changedRequest).toPromise().catch(error => {
console.log('HttpErrorResponse error', error);
if (error instanceof HttpErrorResponse) {
console.log('HttpErrorResponse error status code', error.status);
switch ((<HttpErrorResponse>error).status) {
case 401:
return this.handle401Error(request, next);
}
} else {
console.log('something went wrong error', error);
}
});
}
handle401Error(req: HttpRequest<any>, next: HttpHandler) {
console.log('handle401Error called...');
if (!this.isRefreshingToken) {
this.isRefreshingToken = true;
let cachedRequest = req;
this.authService.getFreshAccessToken().then((res) => {
next.handle(cachedRequest).toPromise();
}).catch(error => {
this.authService.logout();
}).finally(() => {
cachedRequest = null;
this.isRefreshingToken = false;
});
}
}
}
【问题讨论】:
标签: angular ionic-framework angular-http-interceptors