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;
})
);
}
}
}
Теперь вы можете указать, что должно происходить, когда сервер не работает в соответствии с вашим приложением.
Надеюсь, это поможет.