Javascript 快速生成器,Socket.io事件多次发出
我已经使用express generator创建了一个节点应用程序。我在应用程序中集成了socket.io。由于express generator有自己创建express server的方法,因此我成功地将套接字连接与侦听服务器集成,并通过res.io实例使io在整个应用程序中可用 文件:bin/wwwJavascript 快速生成器,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');
#!/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上发射