2014-09-11 22 views
32

Giả sử tôi có máy chủ nút bắt đầu bằng cổng nn và không có bất kỳ dịch vụ WebSocket nào trên đó.Làm thế nào để bắt kết nối WebSocket với 'ws: // xxx: nn' không thành công: Kết nối đã đóng trước khi nhận được lỗi trả lời bắt tay?

Và sự cố là khách hàng của tôi cố kết nối dịch vụ WebSocket với máy chủ này.

Rõ ràng, không nên kết nối với máy chủ.

nhưng tôi không thể bắt lỗi này, mã khách hàng của tôi như sau:

try { 
    this.ws = new WebSocket('ws://xxx:nn'); 
} catch (e) { 
    fallback(); 
    console.warn(e); 
} 

Kỳ vọng của tôi là phương pháp fallback được gọi khi kết nối thất bại, nhưng thực sự là lỗi mà tôi có thể làm cho nó bắt bởi trên try...catch

Có ai biết cách bắt lỗi trong ứng dụng của tôi không?

+5

Cậu kết thúc việc tìm kiếm một giải pháp cho việc này? – orange

+2

Có thể trùng lặp của [Javascript không phát hiện lỗi trong quá trình khởi tạo WebSocket] (http://stackoverflow.com/questions/31002592/javascript-doesnt-catch-error-in-websocket-instantiation) –

Trả lời

4

Bạn có thể đăng onerror callback của đối tượng WebSocket

exampleSocket.onerror=function(event){ 
    console.log("Error"); 
} 

Bạn có thể tham khảo theo gương. http://jsfiddle.net/g28yuymv/1/

bắt dụ lỗi http://jsfiddle.net/g28yuymv/4/

+2

Điều này sẽ không hoạt động, tôi đã thử. Trường hợp của tôi là tôi có một máy chủ đang chạy trên cổng 'nn', nhưng không có bất kỳ dịch vụ webSocket nào trên đó. Trong khi máy khách cố gắng kết nối máy chủ này bằng cách sử dụng websocket, lỗi được ném và 'try..catch' cũng không phải' onerror' không thể bắt được ngoại lệ này – Howard

+2

OK @ Howard.Trong ví dụ của tôi (http: // jsfiddle. net/g28yuymv/10 /) Tôi có thể nhận sự kiện onError nếu không có dịch vụ WS chạy trên cổng được yêu cầu.Nếu bạn đã lưu trữ bất kỳ dịch vụ WS nào trên bất kỳ đám mây công khai nào, hãy cho tôi biết url kiểm tra. Theo tôi bạn đang nhấn "500 lỗi máy chủ nội bộ" hành vi. – shivakumar

+0

Cảm ơn. Tôi có thể thử nghiệm thêm cho hành vi này – Howard

3

readyState bộ tài sản cho 1 khi kết nối thành công do đó nó có thể được sử dụng để xác định tình trạng kết nối, kết nối ổ cắm thường mất < 1 giây, vì vậy chúng ta có thể an toàn mất 3 giây khoảng trống và sau đó kiểm tra trạng thái kết nối.

Tiếp theo là mã

this.ws = new WebSocket('ws://xxx:nn'); 

     setTimeout(function() { 


      if (this.ws.readyState != 1) { 
       alert("Problem connection , kindly contact system admin ."); 
      } 


     }, 3000); 
+0

Vui lòng thêm giải thích mã của bạn vào câu trả lời của bạn. Đã thêm giải thích – rgettman

+0

@rgettman. –

7

Nhìn vào spec HTML5 WebSockets, bạn có thể vượt qua một giá trị vào phương pháp close(). Sau đó, trên trình nghe sự kiện onclose(), bạn có thể kiểm tra lại giá trị đó. Điều này mang lại cho bạn cơ hội để thiết lập các trình xử lý cho các kịch bản ngắt kết nối khác nhau và sau đó xử lý mọi thứ khác như một lỗi chung.

https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#close()

var _websocket; 

function wsConnect() { 
    if (_websocket) { 
    _websocket.close(3001); 
    } else { 
    _websocket = new WebSocket("wss://echo.websocket.org1"); 
    _websocket.onopen = function() { 
     console.log('connected'); 
    }; 
    _websocket.onmessage = function(msg) { 
     console.log(msg); 
    }; 

    _websocket.onclose = function(evt) { 
     if (evt.code == 3001) { 
     console.log('ws closed'); 
     _websocket = null; 
     } else { 
     _websocket = null; 
     console.log('ws connection error'); 
     } 
    }; 

    _websocket.onerror = function(evt) { 
     if (_websocket.readyState == 1) { 
     console.log('ws normal error: ' + evt.type); 
     } 
    }; 
    } 
} 

wsConnect(); 

ngọt fiddle: https://jsfiddle.net/lamarant/ry0ty52n/

+0

Tôi muốn nắm bắt lỗi ECONREFUSED bất cứ khi nào tập lệnh của tôi cố gắng kết nối lại với máy chủ websocket, mã trên hoạt động hoàn hảo, nó đã lưu tập lệnh nodejs của tôi bị lỗi khi kết nối lại. – Jayant

Các vấn đề liên quan