14

我正在开发一个使用服务器提供的 JSON 服务的前端。

我很乐意使用 Angular2 的 HTTP,并且可以通过.catch()运算符捕获错误。

如果我发现与特定服务相关的问题(例如,该服务未由服务器定义),catch()操作员会收到一个Responsewith 状态404,我可以轻松地管理这种情况。

另一方面,如果是服务器完全宕机,catch()操作员会收到一个带有状态码的响应,200并且没有与问题原因(即整个服务器宕机)相关的特定符号或文本。在控制台上,我看到 angular ( http.dev.js ) 写了一条消息net::ERR_CONNECTION_REFUSED,但我不知道如何在我的代码中执行类似的操作(即了解正在发生的事情并做出适当的反应)。

任何帮助,将不胜感激。

4

3 回答 3

8

如果您想在您的应用程序中全局处理此事件,我建议您使用稍作修改的 Nicolas Henneaux 的答案https://stackoverflow.com/a/37028266/1549135

基本上,您可以检查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 {
}
于 2016-12-02T13:27:38.150 回答
1

我在使用 angular2.0.0-beta.15 时遇到了同样的问题

这似乎是一个错误。您得到 http 状态 200,这是不正确的:

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

于 2016-04-20T10:14:21.603 回答
0

好吧,我以前也遇到过类似的事情。我试图创建一个日志服务和一个错误处理,它告诉用户是否对服务器的某些请求发生错误或者整个服务器是否关闭。

我使用 HTTP 拦截器来捕获响应,这里是代码:

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

现在您可以根据您的应用程序指定当服务器关闭时应该发生什么。希望有帮助。

于 2019-10-17T07:27:14.487 回答