web-dev-qa-db-ja.com

Socket.ioのFirefoxで「ページの読み込み中にwebsocketが中断されました」

Error: The connection to <websocket> was interrupted while the page was loading.
Source File: localhost/socket.io/node_modules/socket.io-client/dist/socket.io.js
Line: 2371

Socket.ioを初めて使用し、これを検索しようとしましたが、返事がありませんでした。

Firefoxでページを更新すると、Websocketが中断されます。サーバー側がクライアントの承認を待っているのはそのためです。

コードは次のとおりです。

server.js-->
var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(8080);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }
    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    //alert(JSON.stringify(data));  
    console.log(data);
  });

});

index.html

<script src="node_modules/socket.io-client/dist/socket.io.js"></script>
    <script>

      var socket = io.connect('http://localhost:8080');

      socket.on('news', function (data) {
        alert(JSON.stringify(data));
        console.log(data);
        socket.emit('my next event', { my: 'data' });
      });

    </script>
46
Amar

開いているWebSocketを閉じていないためです。

このコードはこのエラーを取り除きます:

$(window).on('beforeunload', function(){
    socket.close();
});
44
Alexander C.

これはFirefoxの未解決のバグのようです(2015-03-29現在):

https://bugzilla.mozilla.org/show_bug.cgi?id=712329

アレクサンダーが指摘したように、回避策は(今のところ)beforeunloadでwebsocketでclose()を呼び出すことです。

2016-04の更新:Bugzillaによると、これはFirefox 48で修正されます

13
user1338062

Socket.IOのチュートリアルを実行したところ、この問題にぶつかりました。投稿されたソリューションを試しましたが、まったく機能していないようです。

いくつかのいじりと叫びといくつかのゴムダッキングの後、私は最終的に問題が何であるかを見つけました。問題は、ソケット変数が適切に初期化される前にソケットに接続しようとしていることです。 Javascript boo boo#1。

JQueryを含めるようにファイルを修正し、関数を次のようにラップする場合:

    <script src="/socket.io/socket.io.js"></script>
    <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
        <script>
    $(function(){
      var socket = io.connect('http://localhost:8080');

      socket.on('news', function (data) {
        alert(JSON.stringify(data));
        console.log(data);
        socket.emit('my next event', { my: 'data' });
      });       
    });
    </script>

より多くの成功を収めることができます。

2
Joe

これはアプリケーションにどのような影響を与えますか?私の推測では、コンソールにエラーが表示されるのは素晴らしいことではありません。

ここでの問題は、Firefoxがこのエラーを記録していることであり、それに対してできることは何もないということです。 try...catchブロックまたはwebsocket.onerror/websocket.oncloseを介してこのエラーをキャプチャすることはできません。

参照: WebSocket接続の中断をキャッチする方法

関連:

0
leggetter