2017-07-19 1 views
3

J'essaie de consommer une api de repos, avec un http simple. Quand il n'y a pas de registres ma réponse api une erreur 500 comme ça:HttpInterceptors gérer les erreurs HTTP angulaire 4.3

{ "errors": [ { "code": "500", "message": "no registers." } ]}

Alors, je me demande comment je peux écrire un intercepteur pour gérer toutes sortes d'erreur HTTP pour empêcher la connexion de la console de l'erreur @ navigateur.

Mes app.module.ts

import { NgModule, ErrorHandler } from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { FormsModule } from '@angular/forms'; 
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; 
import { sharedConfig } from './app.module.shared'; 
import 'rxjs/add/operator/toPromise'; 
import { NoopInterceptor } from "./app.interceptor"; 

@NgModule({ 
    bootstrap: sharedConfig.bootstrap, 
    declarations: sharedConfig.declarations, 
    imports: [ 
     BrowserModule, 
     FormsModule, 
     HttpClientModule, 
     ...sharedConfig.imports 
    ], 
    providers: [ 
     { provide: 'ORIGIN_URL', useValue: location.origin }, 
     { 
      provide: HTTP_INTERCEPTORS, 
      useClass: NoopInterceptor, 
      multi: true, 
     } 
    ] 
}) 
export class AppModule { 
} 

Mes app.interceptor.ts

import { Injectable } from '@angular/core'; 
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http'; 
import { Observable } from "rxjs/Observable"; 
import 'rxjs/add/operator/do'; 
import 'rxjs/add/operator/map'; 
import { HttpErrorResponse } from "@angular/common/http"; 

@Injectable() 
export class NoopInterceptor implements HttpInterceptor { 

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     const started = Date.now(); 

     return next.handle(req) 
     .do(event => { 
      debugger; 
      if (event instanceof HttpResponse) { 
       const elapsed = Date.now() - started; 
       console.log(`Request for ${req.urlWithParams} took ${elapsed} ms.`); 
      }   
     }); 

    } 
} 

Mes app.service.ts

import { Injectable } from '@angular/core'; 
import { HttpClient, HttpHandler, HttpRequest } from '@angular/common/http'; 
import { Observable } from 'rxjs/Observable'; 
import { Config } from "./app.constantes"; 

@Injectable() 
export class AppService { 
    protected config: Config; 
    constructor(private http: HttpClient) { 
     this.config = new Config();    
    } 

    get(service: string, complementos?: any, parametros?: any) { 
     var complemento = complementos != null && complementos.length > 0 ? complementos.join('/') : ''; 
     var url = this.config.SERVER + service + this.config.TOKEN + '/' + complemento; 
     return this.http.get(this.config.SERVER + service + this.config.TOKEN + '/' + complemento); 
    } 

} 

compra.component.ts est là un faire mon appel get

consultaPeriodoCompra(mes: any): void { 
     var lista = null; 

     this.service.get(this.config.CONSULTA_ULTIMAS_COMPRAS, ['2', mes.anoMes]) 
      .subscribe((response) => {    

       this.atualizaLista(mes, response['payload'].listaTransacao); 
      }, 
      (err) => {      
       this.atualizaLista(mes, []); 
      }); 

    } 

that it's what i want to prevent

+0

Est-ce que vous retournez aussi le code de statut 500? Ou il renvoie un 200 avec lesdites erreurs? – LookForAngular

+0

il retourne également le code d'état 500. –

+0

Que voulez-vous dire en empêchant la connexion dans le navigateur? Est-ce votre seul but? – LookForAngular

Répondre

0

Je ne comprends pas vraiment votre objectif, mais si vous avez besoin pour gérer l'erreur provoquée par un ajax appeler, vous devez réagir à la fonction .onError observable

this.httpService.get(url) 
.subscribe(
    // onnext 
    () => [...], 
    // onError 
    (err) => [...] 
); 

Cependant, onError callbacks sont traité comme un événement terminal, dans le cas où vous voulez continuer le flux, vous devez utiliser un opérateur .catch

Si vous parlez de l'intercepteur angularjs, je crains qu'il n'y ait pas de solution actuelle comme je le sais. Mais vous pouvez facilement réaliser une telle fonctionnalité dans vos services. La plupart du temps, la résolution des erreurs est variée, donc à moins de construire un service d'audit ou une barre de chargement, la meilleure approche est d'appliquer une logique plus spécifique

+0

J'ai mis un peu d'exemple de code pour le rendre plus facile à désinstaller. –

0

Vous pouvez utiliser GlobalErrorHandler qui étend la ErrorHandler et mettre en œuvre la méthode handleError(). Il ne devrait pas le jeter au navigateur alors.