#javascript #node.js #socket.io #authorization #reconnect
#javascript #node.js #socket.io #авторизация #повторное подключение
Вопрос:
Я использую ввод-вывод сокета с помощью простого метода аутентификации токена (на стороне сервера):
io.use(function(socket, next){
var handshake = socket.request;
if(token == handshake._query.token)
{
console.log('Client authorized');
next();
}
else
{
console.log('Client not authorized');
next(new Error('not_authorized'));
socket.disconnect();
}
});
Проблема в том, что если клиенту не удалось выполнить авторизацию в первый раз (неверный токен), он больше не пытается подключиться, даже если я отправлю новое соединение вручную, оно не восстановится до полного обновления страницы. Клиентская сторона:
var socket = io.connect(this.adress, {query: 'token=123456789', transports:['websocket', 'polling'] });
socket.on('error', function(err){
console.log(err);
if(err == 'not_authorized')
{
console.log('gettin toke');//NOT ENTERING HERE
}
PS.connected = false;
});
Как я могу повторить повторное подключение с другим параметром?
Обходной путь, установите для этой переменной значение againg для повторной попытки подключения:
PS.socket.socket.connecting = false;
PS.socket.socket.options.query = 'token=' tok;
Ответ №1:
Согласно образцу документации, который вы не должны использовать socket.disconnect();
. Ваше error
событие на стороне клиента не запускается именно из-за этой строки.
Редактировать:
Вы также можете попытаться установить forceNew
значение true
в параметрах подключения при повторном подключении:
var socket = io.connect(this.adress, {
query: 'token=123456789',
transports:['websocket', 'polling'],
forceNew: true
});
Комментарии:
1. Даже удаление этого не решает. Кажется, что при сбое авторизации соединение больше не может быть повторено.
2. Я протестировал, и это не сработало, я нашел обходной путь для версии 0.9. В редактировании