Angular2 HTTP - How to understand that the backend server is down

后端 未结 3 1498
我在风中等你
我在风中等你 2021-02-19 07:55

I am developing a front end which consumes JSON services provided by a server.

I happily use HTTP of Angular2 and I can catch errors via .catch() operator.

相关标签:
3条回答
  • 2021-02-19 08:41

    I have the same problem while using angular2.0.0-beta.15

    It seems like this is a bug. You get http status 200 and this is not correct:

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

    0 讨论(0)
  • 2021-02-19 08:43

    If you would like to handle this event globally in your application I recommend using slightly modified Nicolas Henneaux's answer https://stackoverflow.com/a/37028266/1549135

    Basically you can check for error.status === 0 which happens when the net::ERR_CONNECTION_REFUSED error occurs.

    The complete module file:

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

    Module file:

    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 {
    }
    
    0 讨论(0)
  • 2021-02-19 08:50

    Well i have faced something similar before. I was trying to make a logging Service and a Error handling which tells the user if error happened with some requests to the server or if the whole server is down.

    I used HTTP Interceptor to catch the responses here is the code:

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

    Now you can specify what should happen when Server is down according to your application. Hope that helps.

    0 讨论(0)
提交回复
热议问题