Node.js .. Socket.io连接在每次页面刷新时增加

时间:2018-01-10 11:35:29

标签: javascript node.js sockets socket.io

我希望你能解决我的问题。

我在“app.js”文件中有这段代码

var express = require('express');
var app = express();
const stores = require('./routes/r_stores');
var server = require('http').createServer(app);
var io = require('socket.io')(server);
app.io=io;

app.use('/stores',stores);
// update question
io.on('connection',function(socket){
  console.log("IO APP CONNECTED  ");
  socket.on('disconnect',function(){
    console.log("IO APP DISCONNECT  ");
  }) 
})
server.listen(3080, function () {
    console.log('listening on port 3080');
});

在“r_stores.js”文件中

var express = require('express');
var router = express.Router();
var app = express();
router.get('/', function (req, res, next) {
   req.app.io.on('connection', function(socket){
          console.log("IO STORES CONNECTED");
          socket.on('disconnect',function(){
            console.log("IO STORES DISCONNECTED");
          })
   })
})
module.exports = router;

客户端刷新页面时出现问题,Socket IO会增加一个用户的连接,当我发出消息时,它会通过连接数发送给客户端。

刷新时,控制台显示此

首次刷新

  

IO APP CONNECTED

     

IO STORES CONNECTED

第二次刷新

  

IO APP CONNECTED

     

IO STORES CONNECTED

     

IO STORES CONNECTED

第三次刷新

  

IO APP CONNECTED

     

IO STORES CONNECTED

     

IO STORES CONNECTED

     

IO STORES CONNECTED

3 个答案:

答案 0 :(得分:0)

这里的问题是你把:

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

app.get()内。这意味着每次触发该路由时,您都会添加另一个io.on('connection', ...)处理程序,从而导致重复的事件处理程序。

您实际上没有连接太多套接字,因为重复的事件处理程序,您只是向控制台输出重复的消息。如果查看连接套接字的实际数量,您会发现实际存在相应的数字。

你应该非常永远不要在路由处理程序中安装事件处理程序,因为每次命中该路由时,你都会添加另一个事件处理程序并重复累积(这通常会导致问题)。

您无法展示您在该路线中想要完成的任务,因此我无法为您尝试解决的任何问题提供解决方案。您可以将路径外的io.on('connection', ...)移动到模块的顶层,然后您将在该模块中有一个,但每次该路径被击中时都不会创建重复的事件处理程序。

如果您真正想要做的是能够向请求此路由的客户端发送消息到socket.io connect,那么这是一件更复杂的事情。如果这是一个为HTML页面提供服务的路由(而不是来自已经加载的页面的Ajax调用),因为它是/路由,它看起来就像那样,那么你根本就无法发送路由处理程序中的那个页面的socket.io连接,因为它是一个新的页面,它还没有建立它的socket.io连接(这个页面还没有被发送到了浏览器)。您无法与尚未连接的内容进行通信。也许,无论你想通过socket.io发送什么,你都应该以Javascript状态呈现到页面中,该页面可以在首次运行时访问或包含已经呈现的HTML状态。

答案 1 :(得分:0)

您可以通过控制台记录io.sockets

来查看记录的事件侦听器
Namespace {
  _events:
   { connection: [ [Function], [Function], [Function], [Function] ] },
  _eventsCount: 1 }

要解决您的问题,只需在初始化套接字连接之前放置此条件

  if(io.sockets._events == undefined) {
    io.on('connection', socket => {
      ...
    });
  }

如果connection之外还有其他事件侦听器

  if(!('connection' in io.sockets._events)) {
    io.on('connection', socket => {
      ...
    });
  }

答案 2 :(得分:-1)

当您与服务器连接时,您可以将此信息保存在localStorage中。刷新后检查localStorage中是否有元素可用,如果是false则将信息发送给新用户连接的服务器。