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

Destroy socket.io connection when disconnect

本文关键字:连接 io socket 断开      更新时间:2023-09-26

我遇到了一个问题,即用户与 socket.io 断开连接并且实例(包括所有事件侦听器)保持活动状态。

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

应用.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;

索引.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 数据库,由于上述问题,请求将发布相同数据的多个副本。

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

正如您在每次连接或刷新时所说,您将获得多个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;

在您的索引上.js只需删除 setUp 函数:

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