我已经使用快速生成器创建了一个节点应用程序。我已经在应用程序中集成了socket.io。由于快递生成器有自己的创建快速服务器的方式,我遵循本程序成功地将套接字连接与侦听服务器集成,并通过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};但问题是当我发出一个事件时,如下所示。我的客户正在多次读取数据。
routes/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 不知道是怎么回事。有人能帮我吗?
发布于 2017-10-28 10:32:11
Nodejs是事件driven.The 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对象,然后侦听事件。因此,对于每个请求,您都在侦听套接字'connection' event.That,这意味着您设置多事件侦听器的时间与请求设置新侦听器的name.Every时间相同。
您应该只设置一个单个‘连接’侦听器。
这解释了多次发出相同事件的原因。
app.use(function(req, res, next){
res.io = io;
next();
});不要使用上面的中间件函数,而是直接侦听io实例。
https://stackoverflow.com/questions/46988368
复制相似问题