Сокет.сбой авторизации ввода-вывода не приводит к повторной попытке повторного подключения

#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. В редактировании