我使用快速生成器创建了一个节点应用程序。我在应用程序中集成了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
不确定是什么问题。谁可以帮我这个事?
答案 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 实例
上进行聆听