Обновить параметр строки запроса в сокете.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() с текущим кодом?

3 ответов


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

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

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

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

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

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


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