Express-generator,Socket.io多次发出事件
问题描述:
我已经使用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
不知道什么是错的。谁可以帮我这个事?
答
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实例
完美地工作。而不是添加一个 nsp.on('连接' ,我只是发出nsp.emit –