Я думаю, что лучший способ - использовать функциональность промежуточного программного обеспечения socket.io, которая предотвратит срабатывание обратного вызова on ("connection"), если вы вызовете next () с объектом Error. Он также передаст сообщение об ошибке в интерфейс. Таким способом вы можете отправить токен fre sh и переподключиться.
Вот пример:
async function authenticate(socket,next){
const isExpired = await checkExpireDateEveryMinute(socket.exp, 5);
if(isExpired){
const newToken = getNewToken()//Get a new token...
next(new Error(newToken))//This will cause an error in your frontend, and pass the new token.
}else{
next();
}
}
io.use(authenticate)//Register the middleware.
Я должен кое-что указать: вы выполняете "ожидание" на socket.on (query, ...), который не имеет смысла.
Что касается вашего интерфейса, он может выглядеть примерно так:
function initSocket(token, url) {
const socket = io.connect(url, {//Init the socket.
query: {
token
}
});
return socket;
}
let socket = initSocket('someToken', 'http://localhost:8000')
socket.on('error', async (error) => {
if(error === 'TOKEN_EXPIRED'){
const newToken = await getToken();
socket.close();
socket = initSocket(newToken, 'http://localhost:8000')
}
})
Обратите внимание, что вам нужно будет повторно -регистрация всех событий, которые у вас есть для вашего сокета.