Pytanie "Websocket został przerwany podczas ładowania strony" w przeglądarce Firefox dla Socket.io


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

Jestem nowy w serwisie socket.io i próbowałem go wyszukać, ale nie otrzymałem odpowiedzi.

Websocket jest przerywany, gdy odświeżam stronę w Firefoksie. Właśnie dlatego serwer oczekuje na autoryzację klienta.

Oto kod:

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>

43
2018-01-03 14:03


pochodzenie


Musisz podać kod, który to spowodował. W przeciwnym razie nie ma znaczenia. - ethrbunny
ethrbunny Mam dodany kod sprawdź proszę ... pomóżcie mi ... - Amar
W obliczu prawie podobnego problemu. Proszę pomóż. stackoverflow.com/questions/16880454/... - Sayan


Odpowiedzi:


Dzieje się tak, ponieważ nie zamykasz swojego otwartego websocket.

Ten kod usunie ten błąd:

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

41
2018-05-21 13:15



Pracował również dla mnie - user3508122
Tego doświadczyłem Chrome także. Wydaje się, że to naprawiło. - theblang
Właściwie nie sądzę, żeby to naprawiło. Próbowałem też to, ale tego też nie naprawiłem. - theblang
To nie rozwiązało problemu dla mnie. The pluskwa w Firefoksie <48 było problemem, a obejścia takie jak ten nie działały na mojej wersji Firefoksa (41). Ulepszono to; ale niestety, jeśli piszesz aplikację webową (jak przypuszczam, dlaczego większość z nas interesuje się plikiem socket.io), nie możesz zdecydować, której wersji Firefox (lub innej przeglądarki) używają Twoi użytkownicy. :( - liminalisht
Nie naprawiłem tego, dopóki nie odkryłem, że serwer nie odpowiada na WebSocket close wiadomość. Teraz serwer ładnie potwierdza zakończenie i Firefox (60.0) jest szczęśliwy. - Jan Wielemaker


Wydaje się to być otwartym błędem w Firefoksie (stan na dzień 2015-03-29):

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

Obejście problemu (na razie) polega na wywołaniu close () na websocket on beforeunload, jak zauważył Alexander.

Aktualizacja 2016-04: Według Bugzilli, zostanie to naprawione w Firefoksie 48


12
2018-03-29 13:13



to obejście nie działa dla socket.io (przy użyciu aktualnej wersji 1.3.5) - Lukas
@LukasLiesis Myślę, że to nie ma nic wspólnego z serwerem gniazd. Używam serwera PHP WebSockets - Victor
@Victor socket.io jest używany po obu stronach - serwer i klient - Lukas
@LukasLiesis, ale nadal nie ma to nic wspólnego z produktem socket.io - Victor
Aktualizacja Firefoksa była jedyną rzeczą, która działała dla mnie. Thx za to. "Obejście" nie działa dla mnie w przeglądarce Firefox 41. - liminalisht


Właśnie przeglądałem samouczki Socket.IO i wpadłem na ten dokładny problem. Próbowałem opublikowanych rozwiązań, ale w ogóle nie działały.

Po kilku błahostkach i kilku wrzaskach i gumowym kucaniu w końcu zorientowałem się, o co chodzi. Problem polega na tym, że próbuje on połączyć się z gniazdem, zanim zmienne gniazda zostaną poprawnie zainicjowane. JavaScript boo boo # 1.

Jeśli dodasz plik do jQuery, a następnie otoczysz swoje funkcje w ten sposób:

    <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>

Będziesz mieć o wiele większy sukces.


2
2018-02-11 09:56



To nic dla mnie nie rozwiązuje. Ten sam komunikat o błędzie nadal jest rejestrowany w konsoli. - ThisClark


Jaki wpływ ma to na twoją aplikację? Domyślam się, że po prostu nie jest dobrze widzieć błąd w konsoli.

Problem polega na tym, że widzisz, że Firefox loguje ten błąd i nic nie możesz na to poradzić. Nie można przechwycić tego błędu za pomocą a try...catch blokować lub przez websocket.onerror/websocket.onclose.

Widzieć: Jak złapać przerwę w połączeniu z WebSocket?

Związane z:


0
2018-01-03 17:58



leggetter -> po stronie serwera klient nie uzyskuje autoryzacji, dlatego klient nie emituje żadnych danych. Ale w przeglądarce Internet Explorer 9 uzyskuje autoryzację, a także emituje dane bcoz, czyli używa xhr-polling. - Amar
Na podstawie twojego pytania brzmi to tak, jakbyś pytał, dlaczego otrzymujesz przerwany błąd. Jeśli nie o to pytasz, zaktualizuj swoje pytanie. - leggetter