Подтвердить что ты не робот

Как поймать соединение "WebSocket" с "ws://xxx: nn" не удалось: соединение закрыто, прежде чем получить сообщение об ошибке "Ответ на рукопожатие"?

Допустим, у меня есть сервер узлов, запущенный с портом nn, и на нем нет службы WebSocket.

И проблема в том, что мой клиент пытается подключить службу WebSocket к этому серверу.

Очевидно, что он не сможет подключиться к серверу.

Но я не смог уловить эту ошибку, мой клиентский код выглядит следующим образом:

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

Я ожидаю, что fallback метод вызывается при сбое подключения, но на самом деле ошибка не перехватывается вышеупомянутой try...catch

Кто-нибудь знает, как отловить ошибку в моем случае использования?

4b9b3361

Ответ 1

Вы можете зарегистрироваться для обратного вызова onError объекта websocket

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

Вы можете сослаться на следующий пример. http://jsfiddle.net/g28yuymv/1/

пример отлова ошибки http://jsfiddle.net/g28yuymv/4/

Ответ 2

Глядя на спецификацию 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/

Ответ 3

Свойство readyState устанавливается в 1, когда соединение установлено успешно, поэтому его можно использовать для определения состояния соединения, соединение через сокет обычно занимает <1 сек, поэтому мы можем безопасно взять интервал в 3 сек и затем проверить состояние соединения.

Ниже приведен код:

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

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

Ответ 4

Приведенные выше ответы не могут быть правильными. Вы хотите рассматривать это как ошибку. Но это сообщение является скорее предупреждением/информацией, которая отображается, когда происходит следующее.

WebSocketTransport.prototype.close = function() {
  debug('close');
  var ws = this.ws;
  this._cleanup();
  if (ws) {
    ws.close();
  }
};

правильно должно быть:

exampleSocket.onclose = async (event) => {
        console.error(event);    
//do what you want
}