2016-02-24 13 views
6

Tôi đang phát triển giao diện người dùng tiêu thụ các dịch vụ JSON do máy chủ cung cấp.Angular2 HTTP - Cách hiểu rằng máy chủ phụ trợ bị gỡ xuống

Tôi vui vẻ sử dụng HTTP của Angular2 và tôi có thể phát hiện lỗi thông qua nhà điều hành .catch().

Nếu tôi tìm thấy sự cố liên quan đến dịch vụ cụ thể (ví dụ: dịch vụ không được máy chủ xác định), nhà điều hành catch() sẽ nhận được Response với trạng thái 404 và tôi có thể dễ dàng quản lý tình huống.

Mặt khác, nếu máy chủ hoàn toàn ngừng hoạt động, nhà điều hành catch() sẽ nhận được Phản hồi có mã trạng thái 200 và không có dấu hiệu hoặc văn bản cụ thể nào liên quan đến nguyên nhân của sự cố (đó là toàn bộ máy chủ xuống). Trên bảng điều khiển, tôi thấy rằng góc (http.dev.js) viết một tin nhắn net::ERR_CONNECTION_REFUSED nhưng tôi không biết cách làm điều gì đó tương tự (tức là hiểu điều gì đang xảy ra và phản ứng một cách thích hợp) từ bên trong mã của tôi.

Mọi trợ giúp sẽ được đánh giá cao.

+0

Bạn tìm một giải pháp cho việc này? Xem thêm câu trả lời của tôi ở đây .... –

+0

Nếu tôi gặp lỗi trong thao tác http (ví dụ POST, GET) và trạng thái lỗi là 200 thì tôi giả sử toàn bộ máy chủ bị hỏng, giống như 'private handleError (lỗi: Response) { lỗi ler; if (error.status == 200) { errorText = 'Toàn bộ server bị hỏng. Kết nối đã bị từ chối. '; } trả lại Observable.throw (errorText || 'Lỗi máy chủ'); } '; xa chắc chắn rằng phương pháp này là thực sự OK, nhưng dường như làm việc trong các trường hợp tôi phải đối mặt – Picci

+0

Hình như một giải pháp tốt. Nhưng bạn nên nhận ra rằng mã của bạn sẽ bị hỏng nếu chúng giải quyết vấn đề này và bạn nâng cấp. Do đó, có thể nên đặt một 'TODO' mỗi khi bạn sử dụng cách này –

Trả lời

1

Tôi có cùng sự cố khi sử dụng angular2.0.0-beta.15

Có vẻ như đây là lỗi. Bạn nhận được tình trạng http 200 và điều này là không đúng:

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

+1

Liên kết BTW bị hỏng kể từ hôm nay – superjos

4

Nếu bạn muốn xử lý sự kiện này trên toàn cầu trong ứng dụng của bạn tôi khuyên bạn nên sử dụng sửa đổi một chút Nicolas Henneaux của câu trả lời https://stackoverflow.com/a/37028266/1549135

Về cơ bản bạn có thể kiểm tra error.status === 0 xảy ra khi xảy ra lỗi net::ERR_CONNECTION_REFUSED.

hoàn chỉnh tập tin mô-đun:

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

} 

Mô-đun 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 { 
} 
Các vấn đề liên quan