在socket.io重新连接时更新查询字符串参数

时间:2014-02-23 14:06:03

标签: 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();

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

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

我在调用重新连接函数时尝试设置当前参数,但这似乎不起作用。

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

是否有一种简单的方法只使用当前env.id值更新查询字符串,然后重新连接?

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

5 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:8)

在当前版本的socket.io中(编写本文时为1.3.7),您应该使用

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

但请注意使用此this bug

答案 2 :(得分:2)

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

答案 3 :(得分:0)

您可以像这样使用反射:

$('#ShowEvent').click(function() {

        var idEvent = document.getElementById("ShowEvent").getAttribute("idEvent");

        $.ajax({
            url: 'http://localhost/salgadar/public_html/Event/GetEventById',
            type: 'get',
            data: {
                idEvent: idEvent
            },
            dataType: 'JSON',
            success: function(data) {
                alert('AJAX call was successful!');
                $("#AjaxReturn").html(data)
            },
            error: function() {
                alert('There was some error performing the AJAX call!');
            }
        });

        console.log(data);
    });

答案 4 :(得分:0)

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

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