2016-02-24 10 views
6

Sto sviluppando un front-end che consuma servizi JSON forniti da un server.HTTP angolare2 - Come capire che il server back-end non funziona

Utilizzo felicemente HTTP di Angular2 e posso rilevare errori tramite l'operatore .catch().

Se trovo un problema relativo ad un servizio specifico (ad esempio, il servizio non è definita dal server) l'operatore catch() riceve un Response con lo stato 404 e posso gestire facilmente la situazione.

D'altra parte, se il server è completamente inattivo, l'operatore catch() riceve una risposta con codice di stato 200 e nessun segno o testo specifico correlato alla causa del problema (ovvero che l'intero server è giù). Sulla console vedo che l'angolare (http.dev.js) scrive un messaggio net::ERR_CONNECTION_REFUSED ma non so come fare qualcosa di simile (cioè capire cosa sta succedendo e reagire in modo appropriato) all'interno del mio codice.

Qualsiasi aiuto sarebbe apprezzato.

+0

Hai trovato una soluzione per questo? Vedi anche la mia risposta qui ... –

+0

Se rilevo un errore in un'operazione http (ad es. POST, GET) e lo stato di errore è 200, suppongo che l'intero server sia inattivo, qualcosa come 'private handleError (error: Response) { errore ler; if (error.status == 200) { errorText = 'L'intero server non funziona. La connessione è stata rifiutata. '; } return Observable.throw (errorText || 'Server error'); } '; tutt'altro che sicuro che questo metodo è davvero OK, ma sembra funzionare nei casi che affronto – Picci

+0

Sembra una buona soluzione. Ma dovresti capire che il tuo codice si romperà se risolvono questo problema e tu aggiorni. Pertanto, potrebbe essere una buona idea inserire un 'TODO' ogni volta che si utilizza questa soluzione alternativa. –

risposta

1

Ho lo stesso problema durante l'utilizzo angular2.0.0-beta.15

Sembra che questo è un bug. Si ottiene di stato HTTP 200 e questo non è corretto:

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

+1

Il collegamento BTW è interrotto a partire da oggi – superjos

4

Se si desidera gestire questo evento a livello globale nell'applicazione mi consiglia di utilizzare risposta di leggermente modificata Nicolas HENNEAUX https://stackoverflow.com/a/37028266/1549135

In sostanza si può controllare per error.status === 0 che si verifica quando si verifica l'errore net::ERR_CONNECTION_REFUSED.

Il file modulo completo:

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; 
    } 

} 

file del modulo:

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 { 
}