【问题标题】:Update query string parameter at socket.io reconnect在 socket.io 重新连接时更新查询字符串参数
【发布时间】:2014-03-25 00:31:51
【问题描述】:

当客户端通过 socket.io 连接时,我传递了一个包含 ID 的自定义查询字符串来授权服务器上的客户端。

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 值更新查询字符串然后重新连接?

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

【问题讨论】:

标签: node.js parameters socket.io reconnect


【解决方案1】:

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

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

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

【讨论】:

  • 如何通过查询选项传递 2 个参数?提前致谢!
  • 试试socket.socket.options.query = 'i='+env.id+'&j='+env.j;。在它们之间放置一个&
  • 我可能错了,但我相信这种行为会在 v1.5 中中断
【解决方案2】:

在当前版本的 socket.io 中(目前是 1.3.7)你应该使用

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

但是要小心使用这个由于this bug

【讨论】:

    【解决方案3】:

    使用 socket.io 版本 1.4.8 ,我尝试了很多方法来让它工作,最终对我有用的是在调用 connect( ) 重新连接

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

    【讨论】:

    • 这个解决方案以某种方式对我有用,它只在重新连接时更新查询参数,查询参数没有更新,但随着 Uri 的变化和查询的变化它可以工作。谢谢
    • 从 2.0.3 开始对我不起作用,我尝试更改 socket.io.opts.query、socket.query、socket.io.uri 和 socket.uri :/跨度>
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      你可以像这样使用反射:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 2013-12-25
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 2011-11-22
        相关资源
        最近更新 更多