Javascript 快速生成器,Socket.io事件多次发出

Javascript 快速生成器,Socket.io事件多次发出,javascript,node.js,sockets,express,socket.io,Javascript,Node.js,Sockets,Express,Socket.io,我已经使用express generator创建了一个节点应用程序。我在应用程序中集成了socket.io。由于express generator有自己创建express server的方法,因此我成功地将套接字连接与侦听服务器集成,并通过res.io实例使io在整个应用程序中可用 文件:bin/www #!/usr/bin/env node var app = require('../app').app; var debug = require('debug')('www:server');

我已经使用express generator创建了一个节点应用程序。我在应用程序中集成了socket.io。由于express generator有自己创建express server的方法,因此我成功地将套接字连接与侦听服务器集成,并通过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};
   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);
    });
但问题是当我发出如下所示的事件时。我的客户正在多次读取数据

routes/index.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};
   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));
    });

不知道怎么了。有人能帮我吗

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对象并侦听事件。 因此,对于每个请求,您都在侦听套接字“连接”事件。这意味着您正在设置具有相同名称的多个事件侦听器。每次发出请求时,您都会设置一个新侦听器

您应该只设置一个
单个
“连接”侦听器

这解释了多次发射同一事件的原因


不要使用上面的中间件功能,而是直接监听io实例

工作得很好。我没有添加nsp.on('connection'),而是在nsp.emit上发射