Hoe de ‘WebSocket-verbinding met ‘ws://xxx:nn’ mislukt: verbinding gesloten voordat een handshake-reactie werd ontvangen’-fout?

Stel dat ik een node-server heb gestart met poort nn, en dat er geen WebSocket-service op staat.

En het probleem is dat mijn cliënt een WebSocket-service probeert te verbinden met deze server.

Het is duidelijk dat het geen verbinding met de server zou moeten maken.

Maar ik kon deze fout niet opvangen, mijn klantcode is de volgende:

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

Mijn verwachting is dat de fallback-methode wordt aangeroepen terwijl het verbinden mislukt, maar in werkelijkheid wordt de fout niet opgevangen door de bovenstaande try...catch

Weet iemand hoe ik de fout in mijn usecase kan opvangen?


Antwoord 1, autoriteit 100%

U kunt zich registreren voor onError callback van websocket-object

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

U kunt het volgende voorbeeld raadplegen.
http://jsfiddle.net/g28yuymv/1/

voorbeeld van een vangstfout
http://jsfiddle.net/g28yuymv/4/


Antwoord 2, autoriteit 79%

Als je naar de HTML5 WebSockets-specificatie kijkt, kun je een waarde doorgeven aan de methode close(). Vervolgens kunt u op de gebeurtenislistener onclose() controleren aan de hand van die waarde. Dit geeft je de mogelijkheid om handlers in te stellen voor verschillende scenario’s voor het verbreken van de verbinding en al het andere als een algemene fout af te handelen.

https://developer.mozilla.org/ nl-NL/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();

lieve viool: https://jsfiddle.net/lamarant/ry0ty52n/


Antwoord 3, autoriteit 14%

de bovenstaande antwoorden kunnen niet correct zijn. U wilt het als een fout behandelen. Maar dat bericht is meer een waarschuwing/info die laat zien wanneer het volgende gebeurt.

WebSocketTransport.prototype.close = function() {
  debug('close');
  var ws = this.ws;
  this._cleanup();
  if (ws) {
    ws.close();
  }
};

correct moet zijn:

exampleSocket.onclose = async (event) => {
        console.error(event);    
//do what you want
}

Antwoord 4

readyState-eigenschap wordt ingesteld op 1 wanneer de verbinding succesvol is, daarom kan het worden gebruikt om de verbindingsstatus te bepalen, socketverbinding duurt meestal < 1 sec, dus we kunnen veilig 3 sec pauze nemen en vervolgens de verbindingsstatus controleren.

Hierna volgt de code:

this.ws = new WebSocket('ws://xxx:nn');
setTimeout(() => {
   if (this.ws.readyState !== 1) {
       alert("Problem connection , kindly contact system admin .");
   }
}, 3000);

Other episodes