我有一个问题,在我的应用程序中实现Ionic 3(角度5)拦截器,用于验证我消耗的api。我通过向Bearer添加另一个字符串来强制失败,这是无效的并且可以捕获错误,但是,在第一个实例中它工作,更多的是在第二个调用中它不属于错误(但是api响应了错误403)
addAuthHeader(request) {
return request.clone({
setHeaders: {
"Authorization": 'Bearer ' + _.get(this.localStorageService.getAccessToken(), 'accessToken', '')
}
});
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
//console.log(_.get(req, 'url', ''));
console.log(req);
return next.handle(req).pipe(catchError(err => {
if (err instanceof HttpErrorResponse) {
let statusError = _.get(err, 'status', 0);
console.log(err);
if (statusError == 401 || statusError == 403) {
return this.authProvider.loginPartnerToken()
.switchMap(() => {
//console.log(req);
req = this.addAuthHeader(req);
//console.log(req);
return next.handle(req);
});
}
}
}))
}
我是结果:
如你所见,第一次调用失败,错误是HttpErrorResponse
,而在第二次调用也失败,但错误是一个简单的HttpRequest
如你所说,第一个错误是HttpErrorResponse
的一个实例,而其他错误是HttpRequest
所以它们不会进入你的状态:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(catchError(err => {
if (err instanceof HttpErrorResponse) { // <------ This condition
// If not HttpErrorResponse, don't go here...
// ...
}
}))
}
所以这是拦截器的良好行为。您需要检查您的observable是否正好返回错误,如果您自己制作错误,请检查您是否使用observer.error(...)
处理错误。