2016-02-24 6 views
6

Ich entwickle ein Frontend, das JSON-Dienste nutzt, die von einem Server bereitgestellt werden.Angular2 HTTP - So verstehen Sie, dass der Backend-Server nicht aktiv ist

Ich verwende gerne HTTP von Angular2 und ich kann Fehler über .catch() Operator abfangen.

Wenn ich ein Problem im Zusammenhang mit einem bestimmten Dienst zu finden (zum Beispiel des Dienst nicht durch den Server definiert) die catch() Betreiber erhalten ein Response mit Status 404 und ich kann die Situation leicht verwalten.

Auf der anderen Seite, wenn es der Server, der vollständig nach unten, die catch() Bediener eine Antwort mit dem Statuscode empfangen 200 und ohne spezifische Zeichen oder Text, um die Ursache des Problems im Zusammenhang (das ist, dass der gesamte Server ist Nieder). Auf der Konsole sehe ich, dass eckig (http.dev.js) schreibt eine Nachricht net::ERR_CONNECTION_REFUSED, aber ich weiß nicht, wie etwas ähnliches (d. H. Verstehen, was passiert und reagieren angemessen) aus meinem Code.

Jede Hilfe wäre willkommen.

+0

Haben Sie eine Lösung für diese finden? Siehe auch meine Antwort hier .... –

+0

Wenn ich einen Fehler in einer http-Operation (zB POST, GET) erhalte und der Fehlerstatus 200 ist, dann nehme ich an, dass der ganze Server heruntergefahren ist, etwas wie 'private handleError (error: Response) { Fehler; if (error.status == 200) { errorText = 'Der gesamte Server ist ausgefallen. Die Verbindung wurde abgelehnt. "; } return Observable.throw (errorText || 'Serverfehler'); } '; weit davon entfernt, dass diese Methode wirklich in Ordnung ist, aber scheint in den Fällen zu funktionieren, in denen ich konfrontiert – Picci

+0

Sieht aus wie eine gute Problemumgehung. Sie sollten jedoch feststellen, dass Ihr Code beschädigt wird, wenn Sie das Problem lösen und ein Upgrade durchführen. Daher ist es möglicherweise eine gute Idee, jedes Mal, wenn Sie diese Problemumgehung verwenden, ein 'TODO' zu setzen. –

Antwort

1

Ich habe das gleiche Problem, während angular2.0.0-beta.15

Es scheint, mit wie dies ein Fehler ist. Sie erhalten HTTP-Status 200, und das ist nicht korrekt:

https://github.com/angular/http/issues/54

+1

Die BTW-Verbindung ist heute unterbrochen – superjos

4

Wenn Sie möchten, um dieses Ereignis behandeln global in Ihrer Anwendung Ich empfehle, mit leicht modifizierten Nicolas Henneaux der Antwort https://stackoverflow.com/a/37028266/1549135

Grundsätzlich können Sie Überprüfen Sie für error.status === 0 was passiert, wenn der net::ERR_CONNECTION_REFUSED Fehler auftritt.

Die komplette Modul-Datei:

import { Request, XHRBackend, BrowserXhr, ResponseOptions, XSRFStrategy, Response } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/observable/throw'; 

export class AuthenticationConnectionBackend extends XHRBackend { 

    constructor(_browserXhr: BrowserXhr, _baseResponseOptions: ResponseOptions, _xsrfStrategy: XSRFStrategy) { 
    super(_browserXhr, _baseResponseOptions, _xsrfStrategy); 
    } 

    createConnection(request: Request) { 
    let xhrConnection = super.createConnection(request); 
    xhrConnection.response = xhrConnection.response.catch((error: Response) => { 
     if (error.status === 0){ 
     console.log("Server is down...") 
     } 
     ... 
     return Observable.throw(error); 
    }); 
    return xhrConnection; 
    } 

} 

Modul-Datei:

import { BrowserModule } from '@angular/platform-browser'; 
import { NgModule } from '@angular/core'; 
import { CommonModule } from '@angular/common'; 
import { HttpModule, XHRBackend } from '@angular/http'; 
import { AppComponent } from './app.component'; 
import { AuthenticationConnectionBackend } from './authenticated-connection.backend'; 

@NgModule({ 
    bootstrap: [AppComponent], 
    declarations: [ 
     AppComponent, 
    ], 
    entryComponents: [AppComponent], 
    imports: [ 
     BrowserModule, 
     CommonModule, 
     HttpModule, 
    ], 
    providers: [ 
     { provide: XHRBackend, useClass: AuthenticationConnectionBackend }, 
    ], 
}) 
export class AppModule { 
}