2016-08-13 10 views
11

Wykonywanie wywołania HTTP Angular2 na serwerze w trybie offline nie dostarcza zbyt wielu informacji w jego obiekcie "error response", który dostaję do Obowiązkowego obserwatora (błędu) operatora lub delegata błędu subskrypcji (oba są wspólne dla same informacje). Ale jak widać na zrzucie ekranu konsoli, plik zone.js w jakiś sposób wyświetla błąd. Jak mogę uzyskać te szczegółowe informacje o błędzie (net :: ERR_CONNECTION_REFUSED)?Usługa Angular 2 http. Uzyskaj szczegółowe informacje o błędzie

Dzięki. enter image description here

Odpowiedz

6

Gdy serwer nie odpowiada, response.status będzie zawsze równa 0 (zero)

{ 
    type: 3, //ResponseType.Error 
    status: 0, // problem connecting endpoint 
} 

Należy również pamiętać, kiedy wykonują żądanie CORS, ale pochodzenie (URL w przeglądarce) nie jest autoryzowane (nie na dozwolonej liście nazw hostów skonfigurowanych w zdalnym punkcie końcowym) odpowiedź byłaby podobna do powyższej, z wyjątkiem atrybutu type, który będzie równy 4 = Odpowiedź Type.Opaque ...

Oznacza to, że połączenie zostało nawiązane, ale na przykład żądanie OPTIONS zwrócone z nagłówkami, które nie zawierają pochodzenia lub żądanie HTTPS zostało wykonane ze źródła HTTP.

+0

Zgadza się. typ 3 wskazuje na problem z siecią (choć nie jest to konkretny kod błędu). Więcej informacji można znaleźć tutaj: https://fetch.spec.whatwg.org/#responsetype i tutaj https://fetch.spec.whatwg.org/#concept-network-error Również status type == 3 to zawsze zero. – rook

-1

Bez wkopywania się w kod, moje oczekiwania są takie, że jeśli serwer jest nieosiągalny, wówczas nie można uzyskać odpowiedzi z serwera. Dlatego obiekt Response pozostaje jego stanem początkowym.

1

Możesz obsłużyć komunikaty o błędach, dzięki czemu są one łatwiejsze do odczytania. To na pewno może być rozszerzony na zbyt:

public Get() { 
    return this.http.get(this.URL).map(this.extractData) 
     .catch(this.handleError); 
} 

public extractData(res: Response) { 
    let body = res.json(); 
    return body || {}; 
} 

public handleError(error: any) { 
    let errMsg = (error.message) ? error.message : 
     error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
    console.error(errMsg); 
    return Observable.throw(errMsg); 
} 

Check out this part of the docs on error handling.

+1

Nie, nie dostaniesz żadnego wskazania, że ​​wystąpił błąd połączenia sieciowego za pomocą tego podejścia. – rook

Powiązane problemy