web-dev-qa-db-ja.com

Nodeで「WebSocketはすでにCLOSINGまたはCLOSED状態になっています」をキャッチして対処する方法

「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はすでにCLOSINGまたはCLOSED状態になっています。」をスローします。

これらの切断を検出して対処し、すぐに再接続を試みる方法を探しています。

これを行うための最も正確で効率的な方法は何ですか?

16
adelriosantiago

最も簡単な方法は、送信前にソケットが開いているかどうかを確認することです。

たとえば、単純な関数を作成します。

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

次に、socket.sendの前に、開いていることを確認します。

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

send関数を this answer のように書き換えることもできますが、私のやり方ではこの状況を記録できます。

そして、あなたの2番目のリクエスト

すぐに再度接続を試みます

サーバーから実行する方法はありません。

クライアントコードはWebSocketの状態を監視し、必要に応じて再接続メソッドを適用する必要があります。

たとえば、 this VueJSライブラリが適切に動作することを確認してください。 WS再接続を自動的に有効にするセクションをご覧ください

3
yeya