2016-05-05 6 views
20

Gerade jetzt, wie ich es tun HTTP-Anfragen (entlehnt aus this answer) ist dies zu tun fehlschlagen, wenn der Code-Status zurück etwas anderes als 200. zum Beispiel ist, wenn ein Benutzer etwas schreiben möchte und gibt der Server 400, Winkel 2 die Ausnahme werfen:Wie mit HTTP-Statuscodes anderer als 200 in Angular 2

abgefangene Ausnahme: [object Object]

Wie kann ich das vermeiden? Ich möchte diese Statuscodes in meiner App behandeln, um das Benutzererlebnis zu verbessern (Fehler anzeigen, etc.)

Antwort

41

Ja, Sie können mit dem Fang-Operator wie folgt umgehen und Alert anzeigen, wie Sie wollen, aber zuerst müssen Sie importieren Rxjs für die gleichen wie auf diese Weise

import {Observable} from 'rxjs/Rx'; 

return this.http.request(new Request(this.requestoptions)) 
      .map((res: Response) => { 
       if (res) { 
        if (res.status === 201) { 
         return [{ status: res.status, json: res }] 
        } 
        else if (res.status === 200) { 
         return [{ status: res.status, json: res }] 
        } 
       } 
      }).catch((error: any) => { 
       if (error.status === 500) { 
        return Observable.throw(new Error(error.status)); 
       } 
       else if (error.status === 400) { 
        return Observable.throw(new Error(error.status)); 
       } 
       else if (error.status === 409) { 
        return Observable.throw(new Error(error.status)); 
       } 
       else if (error.status === 406) { 
        return Observable.throw(new Error(error.status)); 
       } 
      }); 
    } 

Sie können auch Fehler handel (mit err Block), den Wurf von catch-Block ist während .map Funktion,

so -

... 
.subscribe(res=>{....} 
      err => {//handel here}); 

aktualisiert

wie für jeden Status erforderlich ist, ohne particluar einer Überprüfung Sie dies versuchen: -

return this.http.request(new Request(this.requestoptions)) 
      .map((res: Response) => { 
       if (res) { 
        if (res.status === 201) { 
         return [{ status: res.status, json: res }] 
        } 
        else if (res.status === 200) { 
         return [{ status: res.status, json: res }] 
        } 
       } 
      }).catch((error: any) => { 
       if (error.status < 400 || error.status ===500) { 
        return Observable.throw(new Error(error.status)); 
       } 
      }) 
      .subscribe(res => {...}, 
         err => {console.log(err)}); 
+0

Ist es möglich, jeden Statuscode als Bedingung nicht schreiben zu müssen? Wie in nur den Status zurückgeben, und dann können meine Komponenten bestimmen, was mit diesen Statuscodes zu tun ist. –

+0

Ja, Sie können einfach den Fehler zurückgeben, ohne den Status zu überprüfen, der davon abhängt, wie Sie den Fehlerblock behandeln wollen. –

+0

Können Sie das bearbeiten? Es fällt Ihnen schwer, das mit Ihrem bestehenden Beispiel zu tun. –