【问题标题】:Angular 2 Http response generic error handlerAngular 2 Http响应通用错误处理程序
【发布时间】:2016-09-10 03:26:13
【问题描述】:

我正在实现一个 Angular 2 应用程序,它将进行一些 API 调用。我想知道是否有一个通用的错误处理程序。例如,如果 API 以 401 代码响应,我想将用户重定向到登录路由。这可能吗?

谢谢

【问题讨论】:

    标签: angular angular-http


    【解决方案1】:

    我创建了一个 http 帮助器方法,我在所有服务中都使用它。这至少集中了应用程序中的所有 http 活动。

    有时会处理错误详细信息 - 请在此处查看我的问题: Angular 2 http service. Get detailed error information

    UPD:2016-09-12 - 修复了 remove 方法。 Angular http 服务需要定义主体。这种方法存在的原因 - 我希望能够将 body 作为 delete 请求的一部分传递,而 Angular 的方法不允许这样做。

    import {Injectable} from '@angular/core';
    import {Http, Request, Response, Headers, RequestOptionsArgs, RequestMethod} from "@angular/http";
    import {RequestArgs} from "@angular/http/src/interfaces";
    import {Observable} from 'rxjs/Observable';
    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/catch';
    import 'rxjs/add/observable/throw';
    
    @Injectable()
    export class JsonHttpHelper {
        protected headers: Headers;
    
        constructor(private _http: Http) {
            this.headers = new Headers();
            this.headers.append('Content-Type', 'application/json');
            this.headers.append('Accept', 'application/json');
        }
    
        get(url:string) : Observable<any> {
            return this._http.get(url)
                .map((res: Response) => res.json())
                .catch(this.handleError);
        }
    
        post(url:string, data:any, args?: RequestOptionsArgs) : Observable<any> {
            if (args == null) args = {};
            if (args.headers === undefined) args.headers = this.headers;
    
            return this._http.post(url, JSON.stringify(data), args)
                .map((res: Response) => JsonHttpHelper.json(res))
                .catch(this.handleError);
        }
    
        put(url:string, data:any, args?: RequestOptionsArgs) : Observable<any> {
            if (args == null) args = {};
            if (args.headers === undefined) args.headers = this.headers;
    
            return this._http.put(url, JSON.stringify(data), args)
                .map((res: Response) => JsonHttpHelper.json(res))
                .catch(this.handleError);
        }
    
        remove(url: string, data?: any, args?: RequestOptionsArgs): Observable<any> {
            if (args == null) args = {};
    
            args.url = url;
            args.method = RequestMethod.Delete;
            if (!args.headers) args.headers = this.headers;
            args.body  = data ? JSON.stringify(data) : null;
    
            return this._http.request(new Request(<RequestArgs>args))
                .map((res: Response) => JsonHttpHelper.json(res))
                .catch(this.handleError);
        }
    
        private static json(res: Response): any {
            return res.text() === "" ? res : res.json();
        }
    
        private handleError(error:any) {
            console.error(error);
            return Observable.throw(error);
    
            // The following doesn't work.
            // There's no error status at least in case of network errors.
            // WHY?!
            //
            // if ( error === undefined) error = null;
            // let errMsg = (error && error.message)
            //     ? error.message
            //     : (error && error.status)
            //         ? `${error.status} - ${error.statusText}`
            //         : error;
            //
            // return Observable.throw(errMsg);
        }
    }
    

    【讨论】:

    • 当一个组件调用你的JsonHttpHelper 实现它自己的catch 函数时会发生什么。哪个会被调用?还是先调用哪个?
    • Helper 将是第一个,但它会重新抛出错误,因此您也可以在组件中获取它。
    • 我认为它不会重新抛出它。我实现了类似的东西,当调用助手中的catch 时。只有调用者中的then 被调用,除非我在帮助程序中手动重新处理错误或更好(就我而言)抛出其他东西。但是这个答案解决了我的问题。谢谢
    • 你是用这个 Helper 类扩展你的服务,还是只是从你的服务中调用这些函数?
    • @EmreÖztürk,就这样吧。服务继承相当麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2017-12-09
    相关资源
    最近更新 更多