web-dev-qa-db-fra.com

Comment intercepter la connexion WebSocket avec 'ws: // xxx: nn' a échoué: la connexion a été fermée avant de recevoir une erreur de poignée de main`?

Disons que j'ai un serveur de nœud démarré avec le port nn, et qu'il n'y a pas de service WebSocket dessus.

Et le problème est que mon client essaie de connecter un service WebSocket à ce serveur.

Évidemment, la connexion au serveur ne devrait pas échouer.

Mais je ne pouvais pas attraper cette erreur, mon code client est le suivant:

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

Mon attente est que la méthode fallback soit appelée lors de l'échec de la connexion, mais en réalité l'erreur n'est pas interceptée par ce qui précède try...catch

Est-ce que quelqu'un sait comment détecter l'erreur dans mon cas d'utilisation?

53
Howard

Vous pouvez vous inscrire pour le rappel onError de l'objet websocket

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

Vous pouvez vous référer à l'exemple suivant. http://jsfiddle.net/g28yuymv/1/

exemple d'erreur de capture http://jsfiddle.net/g28yuymv/4/

11
shivakumar

En regardant la spécification HTML5 WebSockets, vous pouvez transmettre une valeur à la méthode close (). Ensuite, sur l'écouteur d'événement onclose (), vous pouvez vérifier cette valeur. Cela vous donne la possibilité de définir des gestionnaires pour différents scénarios de déconnexion, puis de gérer tout le reste comme une erreur générique.

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

doux violon: https://jsfiddle.net/lamarant/ry0ty52n/

9
lamarant

la propriété readyState prend la valeur 1 lorsque la connexion est établie et peut donc être utilisée pour déterminer l'état de la connexion. La connexion socket prend généralement moins de 1 seconde. Nous pouvons donc prendre un intervalle de 3 secondes en toute sécurité, puis vérifier l'état de la connexion.

Voici le code:

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

setTimeout(() => {
   if (this.ws.readyState !== 1) {
       alert("Problem connection , kindly contact system admin .");
   }
}, 3000);
3
Mr Coder

les réponses ci-dessus ne peuvent pas être correctes. Vous voulez le traiter comme une erreur. Mais ce message est plus un avertissement/info qui montre quand ce qui suit se produit.

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

correct devrait être:

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