如何捕获`WebSocket连接到'ws:// xxx:nn'失败:连接在收到握手响应错误之前关闭?

How*_*ard 54 javascript websocket

假设我有一个以端口启动的节点服务器nn,并且没有任何WebSocket服务.

问题是我的客户端尝试将WebSocket服务连接到此服务器.

显然,它应该无法连接到服务器.

但我无法捕捉到这个错误,我的客户端代码如下:

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

我的期望是fallback在连接失败时调用方法,但实际上我可以通过上面捕获它的错误try...catch

有谁知道如何在我的用例中捕获错误?

shi*_*mar 11

您可以注册websocket对象的onError回调

exampleSocket.onerror=function(event){
    console.log("Error");
}
Run Code Online (Sandbox Code Playgroud)

您可以参考以下示例. http://jsfiddle.net/g28yuymv/1/

捕捉错误示例 http://jsfiddle.net/g28yuymv/4/

  • 这是对的; 发生连接错误时,会执行上述事件处理程序.它可能**看起来像错误没有被处理的原因是因为明显的红色错误文本仍然记录到控制台,即使你在这里处理它.据我所知,还没有任何方法可以阻止明显的红色错误文本. (10认同)
  • 这不行,我试过了.我的情况是我有一个服务器在端口`nn`上运行,但它上面没有任何webSocket服务.当客户端尝试使用websocket连接此服务器时,会抛出错误,并且`try..catch`和`onerror`都无法捕获此异常 (4认同)
  • OK @ Howard.在我的例子中(http://jsfiddle.net/g28yuymv/10/)如果在请求的端口上没有运行WS服务,我就能得到onError事件.如果你在任何公共上托管了任何WS服务云让我知道测试网址.据我说你正在打"500内部服务器错误"的行为. (2认同)

lam*_*ant 9

查看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();
Run Code Online (Sandbox Code Playgroud)

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