2014-09-11 157 views
32

比方說,我有一個節點服務器啓動端口nn,並沒有任何WebSocket服務。如何捕捉WebSocket連接到'ws:// xxx:nn'失敗:連接在收到握手響應之前關閉錯誤?

而問題是我的客戶端嘗試將WebSocket服務連接到此服務器。

顯然,它應該無法連接到服務器。

但以下我沒能趕上這個錯誤,我的客戶端代碼:

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

我的期望是fallback方法被調用,而連接失敗,但實際上,我可以得到它的上面所捕獲的錯誤try...catch

有誰知道如何捕捉我的用例中的錯誤?

+5

你最終找到了一個解決方案? – orange 2015-06-12 07:23:26

+2

[Javascript無法捕獲WebSocket實例化中的錯誤](http://stackoverflow.com/questions/31002592/javascript-doesnt-catch-error-in-websocket-instantiation) – 2016-04-27 14:07:41

回答

4

您可以將WebSocket對象的onError回調註冊

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

你可以參考下面的例子。 http://jsfiddle.net/g28yuymv/1/

捕捉 http://jsfiddle.net/g28yuymv/4/

+2

這是行不通的,我試過。我的情況是我有一個服務器端口'nn',但沒有任何webSocket服務。 雖然客戶端試圖通過使用websocket連接這個服務器,錯誤被拋出,並且'try..catch'和'onerror'都不能捕獲這個異常 – Howard 2014-09-11 08:10:30

+2

OK @ Howard.In我的例子(http:// jsfiddle。 net/g28yuymv/10 /)如果在請求的端口上沒有運行WS服務,我可以得到onError事件。如果您在任何公共雲上託管了任何WS服務,請讓我知道測試網址。據我所知,你正在打「500內部服務器錯誤」的行爲。 – shivakumar 2014-09-11 12:34:59

+0

謝謝。我可以對此行爲做更多的測試 – Howard 2014-09-12 04:12:32

3

readyState屬性設置爲1時的連接是成功的,因此它可以用來確定連接狀態錯誤例如,插座連接通常需要< 1秒,因此,我們可以安全地取3秒然後檢查連接狀態。

以下是代碼

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

     setTimeout(function() { 


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


     }, 3000); 
+0

請在您的回答中添加對您代碼的解釋。 – rgettman 2015-05-19 18:56:35

+0

@rgettman解釋添加。 – 2015-05-20 06:52:04

7

望着HTML5 WebSockets的規範,你可以傳遞一個值到close()方法。然後在onclose()事件監聽器上,您可以檢查該值。這使您有機會爲不同的斷開連接方案設置處理程序,然後將其他一切處理爲通用錯誤。

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

甜小提琴:https://jsfiddle.net/lamarant/ry0ty52n/

+0

我想在每次我的腳本嘗試重新連接到websocket服務器時捕獲ECONREFUSED錯誤,上面的代碼完美工作,它在重新連接期間保存了我的nodejs腳本以免崩潰。 – Jayant 2016-05-19 11:26:02

相關問題