2014-09-11 9 views
32

Załóżmy, że mam serwer węzła uruchomiony z portem nn i nie ma na nim żadnej usługi WebSocket.Jak złapać `Połączenie z WebSocket do 'ws: // xxx: nn' failed: Połączenie zostało zamknięte przed otrzymaniem błędu odpowiedzi podczas uzgadniania?

Problem polega na tym, że mój klient próbuje połączyć usługę WebSocket z tym serwerem.

Oczywiście nie powiodło się połączenie z serwerem.

ale nie mogłem złapać ten błąd, mój kod klienta w następujący sposób:

try { 
    this.ws = new WebSocket('ws://xxx:nn'); 
} catch (e) { 
    fallback(); 
    console.warn(e); 
} 

Moje oczekiwanie jest metoda fallback sprawdzony podczas nawiązywania połączenia nie powiodła się, ale rzeczywiście błąd, że mogę go złapać przez ponad try...catch

Czy ktoś wie, jak złapać błąd w moim usecase?

+5

Czy skończy się znaleźć rozwiązanie dla tego? – orange

+2

Możliwy duplikat kodu [Javascript nie przechwytuje błędu w instancji WebSocket] (http://stackoverflow.com/questions/31002592/javascript-doesnt-catch-error-in-websocket-instantiation) –

Odpowiedz

4

Możesz się zarejestrować za onError zwrotnego obiektu websocket

exampleSocket.onerror=function(event){ 
    console.log("Error"); 
} 

Można odwołać się następujący przykład. http://jsfiddle.net/g28yuymv/1/

wzrok przykładem błędu http://jsfiddle.net/g28yuymv/4/

+2

To nie zadziała, ja wypróbowany. W moim przypadku mam serwer działający na porcie 'nn', ale nie ma na nim żadnej usługi webSocket. Podczas gdy klient próbuje połączyć się z tym serwerem za pomocą websocket, zgłaszany jest błąd, a ani 'try..catch' ani' onerror' nie mogą złapać tego wyjątku. – Howard

+2

OK @ Howard.W moim przykładzie (http: // jsfiddle. net/g28yuymv/10 /) Mogę uzyskać zdarzenie onError, jeśli na żądanym porcie nie działa usługa WS.Jeśli hostowałeś dowolną usługę WS w dowolnej publicznej chmurze, daj mi znać adres URL testu. Według mnie uderzasz w zachowanie "500 wewnętrznych błędów serwera". – shivakumar

+0

Dzięki. Mogę zrobić więcej testów dla tego zachowania – Howard

3

readyState zestawy własności do 1, gdy połączenie jest udane stąd może być używany do określenia stanu połączenia, połączenie za pomocą gniazda trwa zwykle < 1 sek, więc możemy bezpiecznie przyjąć 3 sek gap, a następnie sprawdź stan połączenia.

Poniżej znajduje się kod

this.ws = new WebSocket('ws://xxx:nn'); 

     setTimeout(function() { 


      if (this.ws.readyState != 1) { 
       alert("Problem connection , kindly contact system admin ."); 
      } 


     }, 3000); 
+0

Proszę dodać objaśnienie kodu do odpowiedzi. – rgettman

+0

@rgettman explanation added. –

7

Patrząc na specyfikację HTML5 WebSockets można przekazać wartość do metody close(). Następnie na detektorze zdarzeń onclose() możesz sprawdzić wartość. Daje to możliwość ustawienia programów obsługi dla różnych scenariuszy rozłączania, a następnie obsługiwać wszystko inne jako ogólny błąd.

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(); 

słodkie skrzypce: https://jsfiddle.net/lamarant/ry0ty52n/

+0

Chciałem złapać błąd ECONREFUSED za każdym razem, gdy mój skrypt próbował ponownie połączyć się z serwerem websocket, powyższy kod działa doskonale, to uratował mój skrypt nodejs przed awarią podczas ponownego połączenia. – Jayant