Centralized handling for HTTP errors in Angular 4

后端 未结 2 509
一生所求
一生所求 2021-02-06 12:51

I want to inform the user if an HTTP request fails, without having to write additional code for every HTTP request.

I had a working prototype for angular 2:

<         


        
2条回答
  •  滥情空心
    2021-02-06 13:32

    I'm centralizing this kind of logic inside a BaseService, and then inherit every service from It. Angular 2 doesn't provide Http Interceptors as the previous version, making this kind of stuff difficult to handle.

    import { Injectable } from '@angular/core';
    import { Response } from '@angular/http';
    import { Observable } from 'rxjs/Observable';
    import { NotificationService } from '********';
    
    
    @Injectable()
    export class BaseService {
      protected url: string;
      protected http: Http;
    
      constructor(http: Http, protected notification: NotificationService) {
        this.http = http;
      }
    
      protected extractData(res: Response) {
          //
          // Depende do formato da response, algumas APIs retornam um objeto data e dentro deste o conteudo propriamente dito
          // Em minhas APIs sempre retorno diretamente o objeto que desejo
          //
          return res.json();
      }
    
      protected handleError(error: Response | any) {
        let erros: string[] = [];
    
        switch (error.status) {
          case 400:
            let res = error.json();
    
        //
        // Depende do formato, minhas APIs sempre retornar um objeto com array errors quando tenho 400
        //
            for (let index = 0; index < res.errors.length; index++) {
              let msg = res.errors[index];
              erros.push(msg);
            };
    
            this.notification.showMultipleWarn(erros);
            break;
          case 404:
        this.notification.showWarning('O recurso requisitado não existe.');
        break;
          case 406:
          case 409:
          case 500:
            this.notification.showError('Ocorreu um erro inesperado.');
            break;
          default:
            this.notification.showError('Ocorreu um erro inesperado.');
            break;
        }
    
        return Observable.throw(new Error(error.status));
      }
    }
    

    Here's my blog post explaining some way to handle this less verbosely: Receitas Angular2: Interceptando erros HTTP de forma Global

    The post is written in portuguese, but the code could give you some hints. I'm using this approach in some huge projects right now, and It's working fine.

提交回复
热议问题