Как поймать соединение "WebSocket" с "ws://xxx: nn" не удалось: соединение закрыто, прежде чем получить сообщение об ошибке "Ответ на рукопожатие"?
Допустим, у меня есть сервер узлов, запущенный с портом nn
, и на нем нет службы WebSocket.
И проблема в том, что мой клиент пытается подключить службу WebSocket к этому серверу.
Очевидно, что он не сможет подключиться к серверу.
Но я не смог уловить эту ошибку, мой клиентский код выглядит следующим образом:
try {
this.ws = new WebSocket('ws://xxx:nn');
} catch ( e ) {
fallback();
console.warn(e);
}
Я ожидаю, что fallback
метод вызывается при сбое подключения, но на самом деле ошибка не перехватывается вышеупомянутой try...catch
Кто-нибудь знает, как отловить ошибку в моем случае использования?
Ответы
Ответ 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
}