2017-02-13 1 views
2

Ich mache meine erste angular2 App.Welche Art von JSON sollte von dem Server im Falle eines Fehlers in angular2 zurückkehren

Es wird Login-Verifizierung vom Server. Es sendet Benutzername (E-Mail) und Passwort an den Server und im Gegenzug erhält es das USER OBJECT.

user.ts

export class User { 
    constructor(
    public id: number, 
    public email: string, 
    public password: string, 
    public token: string, 
    public firstName: string, 
    public lastName: string, 
    public lastLogin: number, 
    public credits: number, 
    public isAdmin: number 
    ) { } 
} 

Erfolg json

{"id":2,"email":"[email protected]","password": "", "token":"37ee4a596d443aaf0308c0783bfdcf83","firstName":"John","lastName":"Doe","lastLogin":1486994085,"credits":0,"isAdmin":0} 

Fehlermeldungen

{"code":"empty","error":"Password is empty"} 
{"code":"auth-failed","error":"Login information not correct"} 
{"code":"auth-failed","error":"Invalid id\/token, please login again"} 

Nun, wenn ging mein zu programmieren Fehlermeldungen es hat mich

denken

Mein Code ist dies, wie werde ich Fehler in der angular2

return this.http.get(url) 
      .map(response => response.json() as User) 
      .catch(this.handleError); 

Griff Ich glaube, ich kann nicht die response.json() als Benutzer Ursache es benutzen werden Crash-App im Falle eines Fehlers. Was ist die beste Praxis? Sollte ich mein JSON-Format auch für den Erfolg ändern?

Antwort

1

Zuerst sollten Sie sicherstellen, dass Sie den richtigen HTTP-Statuscode für die Antwort vom Server festgelegt haben (vorausgesetzt, Sie steuern den Server). Anschließend können Sie den Inhalt der Antwort so festlegen, wie Sie möchten, und ihn dann basierend auf dem Status mit dem Catch-Handler beliebig behandeln.

return this.http.get(url) 
     .map(response => response.json() as User) 
     .catch(err => /* handle err*/); 

Weitere Informationen über Statuscodes:

Wenn der Server nicht den Statuscodes einstellen, dann würden Sie bei den Rohdaten schauen müssen, um zu sehen, was Sie bekommen (edit: hoffentlich Dies ist nicht der Fall, da Ihr Server den Regeln nicht folgen würde).

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

+0

Welchen empfehlen Sie neben Status 200. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes ** 401 Status ist gut **? – Sallu

+0

401 ist der allgemeine verwendete Code. Beachten Sie, dass die Regeln um 401 sagen, dass Sie einen WWW-Authenticate-Header mit einigen grundlegenden Informationen bereitstellen müssen, obwohl dies wahrscheinlich übersprungen werden kann, wenn Sie nur in einer Lern-/Proof-of-Concept-Übung sind. Sie können ein Beispiel für diesen Header hier sehen: https://en.wikipedia.org/wiki/Basic_access_authentication –

+0

welchen Statuscode werden Sie normalerweise verwenden, wenn Sie ** nicht ** senden 200 ...? – Sallu

1

Verwenden Sie einfach res.json()

So:

login(){ 
     return this.http.get(url) 
      .map(response => response.json()); 
} 

Dann für Ihre Funktion HTTP-Anforderung wie folgt aufrufen:

this._yourservice.login().subscribe(
     suc => { 
      console.log(suc); // success json, if returned with http response status 200 
     }, 
     err => { 
      var res = JSON.parse(err._body); 
      console.log(suc); // error json if returned with other http response status 
     } 
    ); 
+0

Dieser Code sieht nicht richtig. Wenn der Fehler mit 'catch()' abgefangen und behandelt wird, wird der Fehler-Callback, den Sie an 'subscribe()' übergeben, ** niemals ** aufgerufen. Es ist entweder 'catch()' ODER 'subscribe ({err: errorCallback})', nein? – AngularChef

+0

Ja, Sie haben Recht. Ich habe meine Antwort bearbeitet. Ich benutze nie den Haken, ich benutze nur den Erfolg und Fehler Rückrufe, war vom Kopieren/Einfügen OP-Code – Rossco

+0

Bitte lassen Sie mich diese Antwort versuchen.Ich bearbeite JSON Header und bearbeite eckigen Code. Beide. Es ist ein großer Hinweis. danke – Sallu

0

Wenn Sie Rückkehr HTTP-Statuscodes anderer als 200 als Teil der Server-Antwort, dann wird der Winkel 2 Aufruf an http.get eine Ausnahme werfen, die Sie handleError leitet.

Verwandte Themen