断开连接时销毁socket.io连接

我遇到了一个问题,用户从socket.io断开,实例保持活动,包括所有的事件监听器。

以下两个示例都是由于数百行而导致的进度的部分代码。 但是这个问题依然存在。

app.js例子:

var express = require('express'), app = express(), routes = require('./routes/index'), server = require('http').createServer(app); io = require('socket.io').listen(server); app.engine('handlebars', exphbs({ defaultLayout: 'main' })); app.set('view engine', 'handlebars'); app.use('/', routes); server.listen(3000, function() { console.log('listening on *:3000'); }); module.exports = app; 

index.js路由示例:

 var express = require('express'), router = express.Router(); router.get('/', function(req, res) { res.render('home', { title: 'Home' }); setupSocket(req); }); function setupSocket(req) { io.on('connection', function(socket) { console.log('connected') }); } module.exports = router; 

这将导致:

第一个连接:

 connected 

第二连接:

 connected connected 

第三个连接:

 connected connected connected 

等等。 这将继续页面重新加载,在一个新的选项卡,在新的浏览器或其他任何东西,直到我重新启动节点服务器。

在我的代码我发布数据从客户端到mongo数据库,并由于上述问题,请求将发布相同的数据的多个副本。

所以问题是,如何防止实例在用户离开页面后保持活动?

正如你所说的每一个连接或刷新你得到多个connectedstring输出,这是因为你是每个请求附加socket.io监听器。 这是你应该如何connected你的socket.io connected监听器:

 var express = require('express'), app = express(), routes = require('./routes/index'), server = require('http').createServer(app); io = require('socket.io').listen(server); app.engine('handlebars', exphbs({ defaultLayout: 'main' })); app.set('view engine', 'handlebars'); app.use('/', routes); // Your listener should be outside your routes io.on('connection', function(socket) { console.log('connected') }); server.listen(3000, function() { console.log('listening on *:3000'); }); module.exports = app; 

而你的index.js只是删除setUp函数:

 var express = require('express'), router = express.Router(); router.get('/', function(req, res) { res.render('home', { title: 'Home' }); }); module.exports = router;