Как с помощью SocketIO проверить, что сообщение НЕ было доставлено при трансляции внутри комнаты? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть приложение веб-сокетов и я использую socketIO для отправки сообщения на сервер для взаимодействия со второй страницей.

Страница 1 отправляет сообщение на сервер, сервер сообщает странице 2 что-то сделать . Это работает хорошо, и поскольку у меня есть много разных страниц, делающих это, я использую функцию 'rooms' SocketIO:

Page 1

function tryClose(shortCode) { //shortCode is the room name
  console.log('Trying to close ' + shortCode)
  socket.emit('closePlease', shortCode);
}

========= ================================================== =============== Сервер

socket.on('closePlease', function (data) {      
  //Send a request to any open sessions with an active browser to close the session
  io.sockets.in(data).emit('closePlease');
});

========================= ================================================= Страница 2

socket.on('closePlease', function () {
  console.log ('Remote request to close session received!')
  //close the modal and display main menu.
  
  socket.emit('leaveRoom', shortCode)

});

Моя проблема начинается с того, что сообщение leaveRoom не возвращается на сервер, если пользователь потерял соединение с сервером или веб-страница была уже закрыта без запуска сообщения «leaveRoom». Это возможно, если сеть отключена и браузер закрыт, что приведет к тому, что в моем приложении NodeJS останется открытым ряд объектов и массивов. Об этом позаботится процесс leaveRoom.

Как мне изменить функцию сервера, чтобы, если сообщение closePlease не может быть доставлено на страницу, выполнялась функция leaveRoom на сервере?

Я просмотрел обратные вызовы, но получил сообщение об ошибке о невозможности использовать обратные вызовы при трансляции в комнате.

Я использую версию SocketIO: "^ 2.3. 0 ",

1 Ответ

0 голосов
/ 14 июля 2020

Закончилось следующим. Ключ заключался в ответе здесь: linky

io.in(data).clients((err , clients) => {
    logger.warn('There are ' + clients.length + ' connections in session: ' + data);
    
    if (clients.length > 0) {
        io.sockets.in(data).emit('closeOrder', data);
    }else {
        
        //No connections to this session, remove from the server
        logger.info(_.at(activeRooms[data], 'orgTitle') +' forcefully terminated ' + data + ' due to having no existing session connections');

        
        delete activeRooms[data];

    }
...