Angular2 HTTP - Как понять, что сервер backend

Я разрабатываю интерфейс, который потребляет услуги JSON, предоставляемые сервером.

Я с радостью использую HTTP Angular2, и я могу ловить ошибки с помощью оператора .catch().

Если я нахожу проблему, связанную с конкретной услугой (например, служба не определена сервером), оператор catch() получает Response со статусом 404, и я могу легко справиться с ситуацией.

С другой стороны, если сервер полностью отключен, оператор catch() получает ответ с кодом состояния 200 и не имеет никакого специального знака или текста, связанного с причиной проблемы (что означает, что весь сервер не работает). На консоли я вижу, что angular (http.dev.js) пишет сообщение net::ERR_CONNECTION_REFUSED, но я не знаю, как сделать что-то подобное (например, понять, что происходит и реагировать соответствующим образом) с в моем коде.

Любая помощь будет оценена.

Ответ 1

Если вы хотите обработать это событие глобально в своем приложении, я рекомендую использовать слегка измененный ответ Николя Хенно fooobar.com/questions/90529/...

В основном вы можете проверить error.status === 0, который происходит при возникновении ошибки net::ERR_CONNECTION_REFUSED.

Полный файл модуля:

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

}

Файл модуля:

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

Ответ 2

У меня такая же проблема при использовании angular2.0.0-beta.15

Кажется, что это ошибка. Вы получаете http-статус 200, и это неверно:

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

Ответ 3

Ну, я сталкивался с чем-то похожим раньше. Я пытался создать службу регистрации и обработки ошибок, которая сообщает пользователю, если произошла ошибка с некоторыми запросами к серверу, или если весь сервер не работает.

Я использовал HTTP Interceptor, чтобы поймать ответы, вот код:

export class HttpErrorHandlingInterceptor implements HttpInterceptor {
   constructor(private logService: LogService,
               private layoutStateService: LayoutStateService){}
   intercept(
      req: HttpRequest<any>,
      next: HttpHandler
   ): Observable<HttpEvent<any>> {
     if (req.url) {
         return next.handle(req).pipe(
                map((event: HttpEvent<any>) => {
                   if (event instanceof HttpResponse) {
                        return event;
                   }
                }),catchError(err => {
                    if(!err.status){
                       this.layoutStateService.dispatchServerDown();
                    }else{
                       this.layoutStateService.dispatchAddServerError(err);
                       this.logService.logError(err);
                    }

               throw err;
             })
        );
    }
  }
}

Теперь вы можете указать, что должно происходить, когда сервер не работает в соответствии с вашим приложением. Надеюсь, это поможет.