2017-10-28 79 views
0

我已经使用Express Generator创建了一个节点应用程序。我已经在应用程序中集成了socket.io。由于快递生成器有自己的创建快递服务器的方式,我遵循this procedure成功地将Socket连接与侦听服务器集成在一起,并通过res.io实例在整个应用程序中使io可用。Express-generator,Socket.io多次发出事件

FILE:仓/万维网

#!/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}; 

但问题是,如下所示,当I M发射的事件。我的客户正在多次读取数据。

路线/ 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 

不知道什么是错的。谁可以帮我这个事?

回答

0

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); 
    }); 

让我解释发生了什么above.A用户请求和REQ处理程序被触发并访问资源对象和你监听事件。 因此,对于每个请求,您正在收听的插座“连接” event.That意味着你设定多个事件侦听器具有相同name.Every时间,你提出一个要求你设置一个新听众

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

这说明多次发射相同的事件。

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

代替使用上述中间件功能的,直接监听IO实例

+0

完美地工作。而不是添加一个 nsp.on('连接' ,我只是发出nsp.emit –