Как поймать и иметь дело с "WebSocket уже находится в состоянии ЗАКРЫТИЕ или ЗАКРЫТО" в узле

Я искал решение проблемы "WebSocket уже находится в состоянии CLOSING или CLOSED" и нашел следующее:

  1. Meteor WebSocket уже находится в состоянии CLOSING или CLOSED
  2. WebSocket уже находится в состоянии CLOSING или CLOSED.

Ответ # 1 предназначен для строгого отношения к Meteor, а # 2 не имеет ответов... У меня есть серверное приложение Node с сокетом:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ server });

wss.on('connection', function connection(socket) {
  socket.on('message', function incoming(data) {
    console.log('Incoming data ', data);
  });
});

И клиенты подключаются следующим образом:

const socket = new WebSocket('ws://localhost:3090'); //Create WebSocket connection

//Connection opened
socket.addEventListener('open', function(event) {
  console.log("Connected to server");
});

//Listen to messages
socket.addEventListener('message', function(event) {
  console.log('Message from server ', event);
});

Однако через несколько минут клиенты случайным образом отключаются, а функция

socket.send(JSON.stringify(data));

Затем выкинет "WebSocket уже в состоянии ЗАКРЫТЬ или ЗАКРЫТО".

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

Каков наиболее правильный и эффективный способ сделать это?

Ответ 1

Самый простой способ - проверить, открыт ли сокет или нет, перед отправкой.

Например - напишите простую функцию:

function isOpen(ws) { return ws.readyState === ws.OPEN }

Затем - перед любым socket.send убедитесь, что он открыт:

if (!isOpen(socket)) return;
socket.send(JSON.stringify(data));

Вы также можете переписать функцию send как этот ответ, но, по-моему, вы можете регистрировать эти ситуации.

Насколько я знаю - вы не можете "попытаться подключиться снова" с сервера, вы должны следить за состоянием WebSocket на стороне клиента для этого.