2017-12-24 5 views
1

ich einen API-Aufruf, die manchmal diesen Fehler bekommt:Warum löst eine Instanz von HttpErrorResponse nicht die Fehlerfunktion einer Subskription für eine Serverantwort in Angular mit HttpClient aus?

HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: null, ok: false, …} error: ProgressEvent {isTrusted: true, lengthComputable: false, loaded: 0, total: 0, type: "error", …}headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, headers: Map(0)}message: "Http failure response for (unknown url): 0 Unknown Error"name: "HttpErrorResponse"ok: falsestatus: 0statusText: "Unknown Error"url: null } 

In meinem Code, der Server Aufruf wie so gehandhabt wird ... (Disclaimer, hat einige Code der Kürze halber auf eine einfachere Version reduziert)

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 

getData() { 
    const apiRoot = 'http://whatever.../getSomething...'; 
    const params = new HttpParams().set('foo', 'bar'); 
    const body = { params }; 
    return this.http.get(apiRoot, body) 
     .map(res => res) 
     .catch(err => Observable.of(err)); 
} 

Die Antwort des Servers wird so ...

this.getData().subscribe(
    response => { 
     this.setApiResultsData(response); 
     console.log(response); // <-- where the "error" is printed 
    }, 
    error => { 
     this.setApiResultsError(error.message); 
     console.log(response); // <-- where I would think the error would go is never triggered... ??? 
    } 
); 

Meine Frage ist, warum es nicht zu error in den s übergeben bekommen mögen abonniert Beschreibung? Mache ich etwas falsch? Ich möchte Fehler richtig zu handhaben, so dass ich bin offen für Vorschläge

Antwort

1

Innen getData Sie sind im Wesentlichen von dem Fehler erholt sich von ihr zu kontrollieren und Zurückgeben eines neuen beobachtbar:

.catch(err => Observable.of(err)); 

So ist die Rufmethode nein länger sieht einen Fehler. Sie könnten den Fehler abfangen und einen werfen neue:

getData() { 
    // ... 

    return this.http.get(apiRoot, body) 
     .map(res => res) 
     .catch(err => Observable.throw(err)); 
} 

Oder Sie könnten die catch von innen getData, entfernen, so der ursprüngliche Fehler ausbreitet:

getData() { 
    // ... 

    return this.http.get(apiRoot, body) 
     .map(res => res); 
} 
1

Wahrscheinlich, weil die Antwort eine hat Körper - in diesem Fall betrachtet Angular status von Null nicht als Fehler. Siehe folgenden Code in common/http/src/xhr.ts:

// Normalize another potential bug (this one comes from CORS). 
if (status === 0) { 
    status = !!body ? 200 : 0; 
} 
+0

Ah, macht jetzt vollkommen Sinn. Vielen Dank. Es ist auch ein CORS-Problem, mir war nicht klar, warum ein Statuscode von 0 kein Fehler war. –

Verwandte Themen