在socket.io重新连接更新查询string参数

我通过一个自定义查询string包含一个ID来授权服务器上的客户端,当他通过socket.io连接。

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

当客户端因任何原因断开连接时,只需调用以下function即可重新连接。

 socket.socket.connect(); 

但是,在重新连接时, env.id通常包含与初始连接期间不同的值,我希望在每次重新连接时在查询string中包含当前值。

上面的reconnect方法会再次发送初始值,即使env.id被更改为另一个值。

我试图在调用reconnect函数时设置当前的参数,但这似乎不起作用。

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

有没有简单的方法来更新查询string与当前env.id值,然后重新连接?

或者我需要销毁整个套接字对象一旦断开连接,然后build立一个新的连接使用var socket = io.connect()与当前的ID?

我分析了socket对象并find了解决scheme,因此我正在回答自己的问题。

查询string存储在socket.socket.options.query 。 您可以在重新连接前直接将其更改为所需的值。

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

在当前版本的socket.io中(在编写的时候是1.3.7),你应该使用

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

但要小心使用这个错误

使用socket.io版本1.4.8,我尝试了一堆东西来得到这个工作,最终为我工作的是在调用connect()重新连接之前设置socket.io.uri和socket.io.opts.query

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

这里有更多的上下文代码:

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