断开连接时销毁 socket.io 连接
Destroy socket.io connection when disconnect
我遇到了用户与 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
等等。这将在页面重新加载、新选项卡、新浏览器或其他任何地方继续,直到我重新启动节点服务器。
在我的代码中,我 post 将数据从客户端传输到 mongo 数据库,由于上述问题,请求将 post 相同数据的多个副本.
所以问题是,如何防止实例在用户离开页面后保持活动状态?
正如您在每次连接或刷新时所说,您将获得多个 connected
字符串输出,这是因为您在每个请求上附加了 socket.io 侦听器。这就是你应该如何将 connected
监听器附加到你的 socket.io:
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 上删除设置功能:
var express = require('express'),
router = express.Router();
router.get('/', function(req, res) {
res.render('home', {
title: 'Home'
});
});
module.exports = router;
我遇到了用户与 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
等等。这将在页面重新加载、新选项卡、新浏览器或其他任何地方继续,直到我重新启动节点服务器。
在我的代码中,我 post 将数据从客户端传输到 mongo 数据库,由于上述问题,请求将 post 相同数据的多个副本.
所以问题是,如何防止实例在用户离开页面后保持活动状态?
正如您在每次连接或刷新时所说,您将获得多个 connected
字符串输出,这是因为您在每个请求上附加了 socket.io 侦听器。这就是你应该如何将 connected
监听器附加到你的 socket.io:
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 上删除设置功能:
var express = require('express'),
router = express.Router();
router.get('/', function(req, res) {
res.render('home', {
title: 'Home'
});
});
module.exports = router;