[英]Angular4 intercepting http errors
I wrote an Angular4 http interceptor. 我写了一个Angular4 HTTP拦截器。 It works fine for the request and for non error responses. 它适用于请求和非错误响应。 But I'm not able to intercept an 401 for instance, the interceptor isn't even triggered. 但是例如,我无法拦截401,甚至没有触发拦截器。 Does someone have an idea how to intercept an 401, for instance to forward to the login page? 有人知道如何拦截401,例如转发到登录页面吗?
Here is my code: 这是我的代码:
import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse, HttpErrorResponse } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/do';
import { PersistenceService, StorageType, IPersistenceContainer } from 'angular-persistence';
import { Router } from '@angular/router';
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
storageContainer: IPersistenceContainer
constructor (
public persistenceService: PersistenceService,
public router: Router
) {
this.storageContainer = persistenceService.createContainer(
'org.ptnc.auth',
{type: StorageType.SESSION, oneUse: false}
)
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
req = req.clone({
setHeaders: {
Authorization: 'Bearer ' + this.storageContainer.get('jwt')
}
})
return next.handle(req)
.do(event => {
if(event instanceof HttpResponse ){
console.log('intercepts the response', event)
// this.router.navigate(['/auth/login'])
}
if(event instanceof HttpErrorResponse){
console.log('the real error')
}
})
}
}
If HttpClient
throws an error for a response it bubbles up through the observable chain. 如果HttpClient
为响应抛出错误,则会在可观察链中冒出气泡。
You have to use catch
on the next.handle(req)
observable to catch and handle the error coming from the HttpClient
: 您必须在可观察到的next.handle(req)
上使用catch
来捕获和处理来自HttpClient
的错误:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// ...
return next.handle(req)
.do(event => {
// ...
})
.catch(error => {
// handle the error;
// rethrow it
return Observable.throw(error);
});
}
This is an example of a part of my http.service.ts 这是我的http.service.ts的一部分的示例
get(request: string): Observable<any> {
return this._http.get(`${this.actionUrl}${request}`)
.map(res => this.extractData(res))
.catch(this.handleError);
}
private extractData(res: Response) {
return res.json();
}
private handleError(error: Response) {
console.log('Error', error);
return Observable.throw(error.json().error || 'Server error');
}
Hope it helps as well 希望它也有帮助
To intercept HttpErrorResponse
using HttpInterceptor
you have to make it in the rxjs
way using do
operator. 要使用HttpInterceptor
拦截HttpErrorResponse
您必须使用do
运算符以rxjs
方式进行设置。
import 'rxjs/add/operator/do';
return next.handle(req).do(event => {
console.log('handle success event');
return event;
}, error_event => {
console.log('handle error event, ie 404 or 500');
return error_event;
});
Note: catch didn't did the trick for me because http errors are not firing errors with throw()
注意: catch对我没有帮助,因为HTTP错误不会throw()
错误
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.