Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.io在页面刷新时创建多个连接_Javascript_Express_Socket.io - Fatal编程技术网

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

Javascript Socket.io在页面刷新时创建多个连接,javascript,express,socket.io,Javascript,Express,Socket.io,我正在建立一个聊天室,但在每次刷新页面后,会建立更多的连接。例如,如果我转到聊天室页面,则只创建一个连接。但是,在我刷新一次之后,现在连接了两个客户端。每次页面刷新后,都会再添加一个连接 这是我的聊天路线 /* GET home page. */ router.get('/', accessControl.ensureAuthenticated, function(req, res, next) { const io = req.app.io; console.log('cons

我正在建立一个聊天室,但在每次刷新页面后,会建立更多的连接。例如,如果我转到聊天室页面,则只创建一个连接。但是,在我刷新一次之后,现在连接了两个客户端。每次页面刷新后,都会再添加一个连接

这是我的聊天路线

    /* 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服务器及其侦听器,而不是在路由处理程序中进行配置。

是否等待足够长的时间,以查看之前的连接是否在短时间后关闭?刷新通常是先关闭先前的连接,然后打开一个新连接。在某些情况下,在上一个页面关闭之前可能会有延迟。@jfriend00是的,我在最后一次页面刷新后等待了5分钟,但这并不重要。但之后我无法访问req.app。io@bena-您可以从请求处理程序中发出req.app.io.emit。不确定你还想用req.app.io做什么。在模块的顶层,您已经有了app,因此可以在那里使用app.io。我将套接字连接和侦听器移动到了app.js,但现在我无法确定message.sessionID==req.session.id@bena-如果您需要此类帮助,然后写一个新的问题,描述你想要完成什么,而不是如何去做。当您收到socket.io消息时,此时进程中没有req,所以根本不清楚您要做什么。如果您想从socket.io消息访问http会话,有一些NPM模块可以让您这样做,比如express-socket.io-session。请在新问题中继续。