Node.js 更新socket.io上的查询字符串参数
我传递一个自定义查询字符串,其中包含一个ID,以便在服务器上的客户机通过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(); 但是,
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:/文档给出了一个如何执行此操作的示例: