简体   繁体   English

Angular4拦截HTTP错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM