Node.js 更新socket.io上的查询字符串参数

Node.js 更新socket.io上的查询字符串参数,node.js,parameters,socket.io,reconnect,Node.js,Parameters,Socket.io,Reconnect,我传递一个自定义查询字符串,其中包含一个ID,以便在服务器上的客户机通过socket.io连接时对其进行授权 var env = {id:12345}; var socket = io.connect('https://example.com', {query:'i='+env.id, port:443, reconnect:false, secure:true}); 当客户机由于任何原因断开连接时,他只需调用以下函数即可重新连接 socket.socket.connect(); 但是,

我传递一个自定义查询字符串,其中包含一个ID,以便在服务器上的客户机通过socket.io连接时对其进行授权

var env = {id:12345};
var socket = io.connect('https://example.com', {query:'i='+env.id, port:443, reconnect:false, secure:true});  
当客户机由于任何原因断开连接时,他只需调用以下函数即可重新连接

socket.socket.connect();
但是,在重新连接时,
env.id
通常包含与初始连接时不同的值,我希望在每次重新连接时查询字符串中包含当前值

上述重新连接方法再次发送初始值,即使同时
env.id
已更改为其他值

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

socket.socket.connect('https://example.com', {query:'i='+env.id, port:443, reconnect:false, secure:true})  
是否有一种简单的方法可以仅用当前的
env.id
值更新查询字符串,然后重新连接


或者我是否需要在断开连接后销毁整个套接字对象,然后使用当前id使用
var socket=io.connect()
建立新连接?

我分析了套接字对象并找到了解决方案,因此我回答了我自己的问题

查询字符串存储在
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>

套接字=io.connect('https://socket.example.com/?token='+data.socket_auth_令牌{
重新连接:错误,
传输:['websocket','polling'],
“卸载时同步断开”:true
});
函数重新连接套接字(){
if(套接字类型!=“未定义”&&!socket.connected){
$.ajax({
url:“/api/socket/”,
键入:“POST”,
数据:{
“操作”:“生成令牌”,
},
数据类型:“json”
}).完成(功能(数据){
socket.io.uri=https://socket.example.com/?token='+data.socket_auth_令牌;
socket.io.opts.query='token='+data.socket\u auth\u token;
socket.connect();
});
}
设置超时(重新连接套接字,5000);
}
设置超时(重新连接套接字,5000);

您可以像这样使用反射:

        Field field = Manager.class.getDeclaredField("opts");
        field.setAccessible(true);
        Manager.Options options = (Manager.Options) field.get(socket.io());
        options.query = getQuery();

对于v2.1.1,我通过在更改查询参数后断开并重新连接解决了这个问题:

socket.socket.query = { ...updated queries here}
socket.socket.disconnect().connect()

如何使用查询选项传递2个参数?提前谢谢。!尝试
socket.socket.options.query='i='+env.id+'&j='+env.j。在它们之间放置一个
&
。我可能是错的,但我相信这种行为在v1.5中是不正确的。该解决方案在重新连接时只更新查询参数,对我有效。查询参数没有更新,但通过Uri更改和查询更改,它可以工作。感谢您从2.0.3起我就不工作了,我尝试过更改socket.io.opts.query、socket.query、socket.io.uri和socket.uri:/文档给出了一个如何执行此操作的示例: