Socket.io создание нескольких соединений при обновлении страницы - PullRequest
0 голосов
/ 05 мая 2018

Я создаю чат, но после обновления каждой страницы происходит больше подключений. Например, если я захожу на страницу чата, создается только одно соединение. Однако после того, как я обновил один раз, теперь подключены 2 клиента. После каждого обновления страницы добавляется еще одно соединение.

вот мой маршрут чата

    /* GET home page. */
router.get('/', accessControl.ensureAuthenticated, function(req, res, next) {
  const io = req.app.io;
  console.log('const io created');
  io.on('connection', function(socket){
    console.log(' %s sockets connected', io.engine.clientsCount);
    console.log('[NodeApp] (socket.io) A client has connected');
    socket.on('chat message', function(message){
      if (message.sessionID == req.session.id) {
        io.emit('chat message', message);
        console.log('message: ' + message.message);
      } else {
        console.log('client sessionID ('+message.sessionID+') does not match server sessionID ('+req.session.id+')');
      }
    });
    socket.on('disconnect', function(){
      console.log('[NodeApp] (socket.io) A client has disconnected');
      socket.disconnect();
    });
  });

  res.render('chat/index', {
    title: "Chat",
    //send session id for client verification
    sessionID: req.session.id,
  });
});

вывод после обновления страницы чата 3 раза:

const io created
1 sockets connected
[NodeApp] (socket.io) A client has connected
const io created
[NodeApp] (socket.io) A client has disconnected
1 sockets connected
[NodeApp] (socket.io) A client has connected
1 sockets connected
[NodeApp] (socket.io) A client has connected
const io created
[NodeApp] (socket.io) A client has disconnected
[NodeApp] (socket.io) A client has disconnected
1 sockets connected
[NodeApp] (socket.io) A client has connected
1 sockets connected
[NodeApp] (socket.io) A client has connected
1 sockets connected
[NodeApp] (socket.io) A client has connected
message: test message (should be sent 3 times)
message: test message (should be sent 3 times)
message: test message (should be sent 3 times)

1 Ответ

0 голосов
/ 05 мая 2018

Вы не можете поставить это:

io.on('connection', function(socket){...}

внутри обработчика маршрута. Каждый раз, когда проходит этот маршрут, вы создаете еще одного прослушивателя для события, так что они накапливаются с большим количеством дубликатов, и, таким образом, вы обрабатываете каждое сообщение несколько раз во всех этих дублирующих обработчиках событий.

Вы должны поместить это вне любого обработчика маршрута. Сервер socket.io и его прослушиватели необходимо настраивать при настройке сервера socket.io, а не в обработчике маршрута.

...