2017-05-10 2 views
3

Ich bin mit einem HTTP-Client wich ist eine erweiterte Version von Angular 4 des Http ClientenAngular Http Fehlerstatus fehlt

export class SecurityClient extends Http { 
// ... 
} 

In diesem Client ich Methoden, die Anrufe gegen einen api versuchen, und ich möchte 401 fangen Status, um ein Aktualisierungstoken zu versuchen.

Ich habe eine Implementierung wie folgt aus:

get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
     return super.get(url, this._getOptions(options)).catch((initialError: any) => { 
      console.log('error: ' + JSON.stringify(initialError)); 
      if (initialError && initialError.status === 401) { 
       return this.authService.doRefreshTokenObservable().flatMap((ok) => { 
        if (ok) { 
         return super.get(url, this._getOptions(options)); 
        } else { 
         return Observable.throw('Authentication error'); 
        } 
       }); 
      } else { 
       return Observable.throw(initialError); 
      } 
     }); 
    } 

ziemlich ähnlich wie Winkel in seiner Seite empfiehlt (https://angular.io/docs/ts/latest/guide/server-communication.html)

Aber aus irgendeinem Grund zeigt die erste console.log so etwas wie:

error: {"_body":{"isTrusted":true},"status":0,"ok":false,"statusText":"","headers":{},"type":3,"url":null} 

Und ich kann Statuscode überhaupt nicht erhalten.

Warum passiert es? Es liegt daran, dass ich Httpclient erweitere und etwas falsch gemacht habe? Ich bin diesen seltsamen Status auch immer: 0, Konsole zeigt auch, mit roten Buchstaben:
"No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401." (wir die CORS gut konfiguriert haben, wenn Token ich abrufen erfolgreich die Informationen nicht abgelaufen ist)

+0

Hey Hast du das Problem gelöst? Ich habe auch das gleiche Problem. Wie haben Sie das Problem gelöst? – BHUMICA

+0

Hey! Ja, am Ende war es die Antwort, die als gut bezeichnet wurde, es war ein CORS-Problem. Da das CORS ausgelöst wurde, konnte Angular seinen Fehlerstatus nicht lesen. Ich habe auch festgestellt, dass in diesem speziellen Fall Firefox-Konsolen-Ausgabe klarer als Chrome war. Hoffe, es hilft, fühlen Sie sich frei, etwas mehr zu fragen, wenn nötig! –

Antwort

3

Zuerst sollten Sie Überprüfen Sie Ihre CORS-Konfiguration auf dem Server. Ich weiß, ich weiß, du hast gesagt, du hast es gut konfiguriert, und ich glaube dir, weil ich selbst durch diese Rigamarole gegangen bin. Aber die CORS-Antwort stammt ausschließlich vom Server und sollte nichts mit Ihrem AngularJS zu tun haben. Ich habe persönlich Django-Setups gesehen, bei denen jede Antwortmethode ihre eigene CORS-Konfiguration hatte. Daher ist es möglich, dass einer nicht authentifizierten Anfrage nichts zugewiesen wird, einschließlich der Berechtigungen, die Cross-Origin-Anfrage überhaupt zu stellen.

Zweitens, soweit der Fehlercode, mein erster Gedanke ist, dass der serverseitige Code, der die Antwort generiert, überprüft werden sollte. Ich habe noch nie gesehen, dass Angular einen Antwortcode zurückgegeben hat, der nicht direkt vom Server stammt (was hey, ich habe nicht alles gesehen). Meine Annahme ist, dass es möglicherweise einen Standardstatuscode oder eine falsch konfigurierte Variable gibt, die vom Server zurückgegeben wird.

tl; dr: Es ist wie beide Probleme scheint, CORS und status: 0 sind die Fehler von etwas auf dem Server.

+0

Aber warum dann in der Konsole zeigt den Statuscode 401? Ich werde morgen überprüfen, ob Backend (mit Feder gemacht) etwas Verantwortung hat, aber ich bezweifle es ... Danke für die Antwort sowieso! –

+0

Hier ist ein alter Thread zum Erhalt eines Status von '0', insbesondere im Zusammenhang mit einer 'CORS'-Verweigerung: http: // stackoverflow.com/questions/10909807/response-code-0-getting-json-von-einer-website Es hört sich an, als ob die Header richtig eingestellt sind, aber die JSON-Antwort selbst möglicherweise nicht eingerichtet, um diesen Antwortcode richtig einzuziehen. Hier ist ein Beispiel, wo die Antwortdaten von einer App nicht mit den Headern übereinstimmen, obwohl die Header korrekt sind und alles (was ich vermute) passiert: https://github.com/typhoeus/typhoeus/issues/ 411. – TristanZimmerman

+0

Ich sehe endlich, es war, wie Sie gesagt haben, dass, wenn 401 ausgelöst wurde, die Cors nicht wirksam war. Als eine zusätzliche Anmerkung möchte ich bemerken, dass Chrome-Outputs viel fehlleiten können, ich fand Firefox-Ausgaben klarer. Danke! –

0

Zwei Tage Debugging und in meinem Fall die Antwort war ein Backslash am Ende der URL.

website.com/api/create_user 

Hat nicht funktioniert ...

website.com/api/create_user/ 

Arbeitete !!!!