javascript - Socket.io 在页面刷新时创建多个连接

标签 javascript express socket.io

我正在创建一个聊天室,但每次刷新页面后,都会建立更多连接。例如,如果我转到聊天室页面,则只会创建一个连接。但是,刷新一次后,现在有 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)

最佳答案

你不能把这个:

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

在路由处理程序内。每次命中该路由时,您都会为该事件创建另一个监听器,因此它们会堆积大量重复项,因此您在所有这些重复的事件处理程序中多次处理每条消息。

您需要将其放在任何路由处理程序之外。当您配置 socket.io 服务器时,而不是在路由处理程序中,需要配置 socket.io 服务器及其监听器。

关于javascript - Socket.io 在页面刷新时创建多个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50184957/

相关文章:

node.js - 清除 cloudflare 上的缓存是否也会清除浏览器上的缓存?

javascript - Angular js 停止从 Bootstrap "dropdown-toggle"事件传播

javascript - 获取网页的前 n 个文本字符及其样式等

javascript - Material 组件 : change event in MDCCheckbox not working

javascript - jquery tablesorter zebra on fadein 不起作用?

javascript - Ajax 发布响应返回空对象

node.js - express.js 中的多语言路由?

Node.js + socket.io 返回事件数据

javascript - 如果未设置 cookie,则检查数组是否有重复值,不检查是否设置了 cookie

python - 如何在 socket.io python 服务器中获取连接客户端的 session ID?