我遇到了问题,请在我的应用程序中使用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
答案 0 :(得分:0)
正如您所说,第一个错误是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...
// ...
}
}))
}
这是拦截器的良好行为。您需要检查可观测对象是否很好地返回了错误,并且如果您自己创建了它们,请检查您是否使用observer.error(...)
处理了错误。