Express-generator,Socket.io事件多次发出

时间:2017-10-28 09:48:43

标签: javascript node.js sockets express socket.io

我使用快速生成器创建了一个节点应用程序。我在应用程序中集成了socket.io。由于快速生成器有自己的创建快速服务器的方式,我跟着this procedure成功地将Socket连接与监听服务器集成,并通过res.io实例使io在整个应用程序中可用。

文件: bin / www

#!/usr/bin/env node
var app = require('../app').app;
var debug = require('debug')('www:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = require('../app').server;

/app.js

//Express handler
var app = express();
// Socket configuration
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.use(function(req, res, next){
  res.io = io;
  next();
});

...

module.exports = {app: app, server: server};

但问题是当我发出如下所示的事件时。我的客户多次读取数据。

路由/ index.js

   var clients = 0;
   var nsp = res.io.of('/default-namespace');
    nsp.on('connection', function (socket) {
      clients++;
      console.log(clients + ' clients connected!');
      socket.on('disconnect', (reason) => {
        clients--;
        console.log(clients + ' clients connected!');
      });
         nsp.emit("socketToMe", "New User connected. Current clients:"+ clients);
    });

我的监听器有以下代码: home.pug

 var socket = io('/default-namespace');
 socket.on('socketToMe', function (data) {
    $('#data-div').append($('<li>').text(data));
    });

每当我在incoginito这样的另一个实例中刷新浏览器时,我的主浏览器就会显示多个数据事件。喜欢这个

New User connected. Current clients:1
New User connected. Current clients:2
New User connected. Current clients:1
New User connected. Current clients:2
New User connected. Current clients:1
New User connected. Current clients:1 

不确定是什么问题。谁可以帮我这个事?

1 个答案:

答案 0 :(得分:1)

Nodejs是事件驱动的。 res 对象不是全局变量。 每个请求都会运行Express中间件。

   var clients = 0;
   var nsp = res.io.of('/default-namespace');
   nsp.on('connection', function (socket) {
     clients++;
     console.log(clients + ' clients connected!');
     socket.on('disconnect', (reason) => {
     clients--;
     console.log(clients + ' clients connected!');
     });
     nsp.emit("socketToMe", "New User connected. Current 
     clients:"+clients);
   });

让我解释一下上面发生的情况。用户请求和 req 处理程序被触发,您访问 res 对象并监听事件。 因此,对于每个请求,您正在侦听socket &#39; connection&#39; 事件。这意味着您要设置具有相同名称的多个事件侦听器。每次都是请求您设置新侦听器

您应该只设置&#39;连接&#39;监听器。

这说明多次发出同一事件。

app.use(function(req, res, next){
 res.io = io;
 next();
});

不要使用上述中间件功能,而是直接在 io 实例

上进行聆听