Обновить параметр строки запроса в socket.io reconnect

Я передаю пользовательскую строку запроса, содержащую идентификатор, для авторизации клиента на сервере, когда он подключается через 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() с текущим идентификатором?

Ответ 1

Я проанализировал объект сокета и нашел решение, поэтому я отвечаю на свой вопрос.

Строка запроса сохраняется внутри socket.socket.options.query. Вы можете изменить его до желаемого значения непосредственно перед повторным подключением.

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

Ответ 2

В текущей версии socket.io(на момент написания 1.3.7) вы должны использовать

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

Но будьте осторожны при использовании этого этой ошибки

Ответ 3

Используя версию socket.io 1.4.8, я попробовал кучу вещей, чтобы заставить это работать, что в конечном итоге сработало для меня, было установить как socket.io.uri, так и socket.io.opts.query перед вызовом 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>

Ответ 4

Вы можете использовать отражение следующим образом:

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