2014-02-23 15 views
8

Ich übergebe eine benutzerdefinierte Abfragezeichenfolge, die eine ID enthält, um einen Client auf dem Server zu autorisieren, wenn er über socket.io eine Verbindung herstellt.Aktualisiere Abfragezeichenfolgeparameter bei socket.io reconnect

var env = {id:12345}; 
var socket = io.connect('https://example.com', {query:'i='+env.id, port:443, reconnect:false, secure:true}); 

Wenn ein Client aus irgendeinem Grund getrennt wird, kann er die Verbindung wiederherstellen, indem er einfach die folgende Funktion aufruft.

socket.socket.connect(); 

jedoch zum Zeitpunkt eines Reconnect env.id enthält in der Regel einen anderen Wert als bei der ersten Verbindung und ich mag an jedem Reconnect den aktuellen Wert in dem Query-String haben.

Die obige Reconnect-Methode sendet den Anfangswert erneut, auch wenn env.id inzwischen auf einen anderen Wert geändert wurde.

Ich habe versucht, die aktuellen Parameter beim Aufruf der Reconnect-Funktion zu setzen, aber das scheint nicht zu funktionieren.

socket.socket.connect('https://example.com', {query:'i='+env.id, port:443, reconnect:false, secure:true}) 

Gibt es eine einfache Möglichkeit, nur die Abfrage-String mit dem aktuellen env.id Wert zu aktualisieren und dann wieder an?

Oder muss ich das gesamte Socket-Objekt einmal getrennt zerstören und dann eine neue Verbindung mit var socket = io.connect() mit der aktuellen ID aufbauen?

Antwort

8

Ich analysierte das Socket-Objekt und fand die Lösung, daher beantworte ich meine eigene Frage.

Die Abfragezeichenfolge wird in socket.socket.options.query gespeichert. Sie können es direkt vor dem erneuten Verbinden auf den gewünschten Wert ändern.

socket.socket.options.query = 'i='+env.id; 
socket.socket.connect(); 
+0

Wie kann ich zwei Parameter mit Abfrageoption übergeben? Danke im Voraus.! – Pritam

+0

Versuchen Sie 'socket.socket.options.query = 'i =' + env.id + '& j =' + env.j;'. Setzen Sie ein "&" zwischen ihnen. – Westy92

+0

Ich könnte falsch liegen, aber ich glaube, dieses Verhalten bricht in v1.5 – Aron

6

In der aktuellen Version von socket.io (im Moment des Schreibens ist 1.3.7) Sie

socket.io.opts.query = 'i='+env.id;

Aber Vorsicht der Verwendung dieser aufgrund this bug

2

verwenden sollten Mit socket.io Version 1.4.8 habe ich einige Dinge ausprobiert, um dies zum Laufen zu bringen. Letztendlich funktionierte es für mich, sowohl socket.io.uri als auch socket.io.opts.query vor dem Aufruf von connect() zu setzen, um die Verbindung wiederherzustellen

// Original connection 
socket = io.connect('https://socket.example.com/?token=' + data.socket_auth_token, { 
          reconnection: false, 
          transports: ['websocket', 'polling'], 
          'sync disconnect on unload': true 
        }); 

// Reconnect 

socket.io.uri = 'https://socket.example.com/?token=' + data.socket_auth_token; 
socket.io.opts.query = 'token=' + data.socket_auth_token; 
socket.connect(); 

Und hier ist mehr Code für Kontext:

<script src="//js/contrib/socket.io.js"></script> 
    <script> 

     socket = io.connect('https://socket.example.com/?token=' + data.socket_auth_token { 
      reconnection: false, 
      transports: ['websocket', 'polling'], 
      'sync disconnect on unload': true 
     }); 

     function reconnectSocket() { 
      if (typeof socket != 'undefined' && !socket.connected) { 
       $.ajax({ 
        url: '/api/socket/', 
        type: 'POST', 
        data: { 
         'action': 'generate_token', 
        }, 
        dataType: 'json' 
       }).done(function (data) { 
        socket.io.uri = 'https://socket.example.com/?token=' + data.socket_auth_token; 
        socket.io.opts.query = 'token=' + data.socket_auth_token; 
        socket.connect(); 
       }); 
      } 
      setTimeout(reconnectSocket, 5000); 
     } 
     setTimeout(reconnectSocket, 5000); 
    </script> 
+0

Diese Lösung funktionierte für mich irgendwie nur Aktualisieren von Abfrageparametern beim Wiederverbinden, Abfrageparameter wurden nicht aktualisiert, aber mit Uri ändern und Abfrage ändern funktioniert. Danke – Achilles

+0

Arbeitte nicht für mich ab 2.0.3, ich habe versucht, socket.io.opts.query, socket.query, socket.io.uri und socket.uri zu ändern: / –