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

时间:2016-03-21 14:20:49

标签: javascript node.js express socket.io handlebars.js

我遇到一个问题,即用户与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数据库,由于上述问题,请求将发布相同数据的多个副本。

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

1 个答案:

答案 0 :(得分:1)

正如您在每个连接或刷新时所说,您将获得多个connected字符串输出,因为您在每个请求上附加了socket.io侦听器。这是你应该在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;