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