Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 断开连接时破坏socket.io连接_Javascript_Node.js_Express_Socket.io_Handlebars.js - Fatal编程技术网

Javascript 断开连接时破坏socket.io连接

Javascript 断开连接时破坏socket.io连接,javascript,node.js,express,socket.io,handlebars.js,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 = requi

我遇到了一个问题,用户断开了与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
第二个连接:

connected
connected
connected
connected
connected
connected
第三个连接:

connected
connected
connected
connected
connected
connected
等等。在重新启动节点服务器之前,这将在页面重新加载、新选项卡、新浏览器或其他任何情况下继续

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


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

正如您在每次连接或刷新时所说,您将获得多个连接的
字符串输出,这是因为您在每个请求上都附加了socket.io侦听器。这是您应该如何将
已连接的
侦听器连接到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.on('disconnect',function(){socket.disconnect();})但当我重新加载页面时,它仍然在控制台中堆叠“已连接”。那么,您如何仅在某个URL上打开套接字?为什么要这样做?您希望您的套接字服务器在每次我的套接字启动另一个函数时运行,所以我只希望它在某个URL上注册套接字连接。我把它放在URL请求块下,但我遇到了与OP相同的问题。但这是前端特定的。在您的网站上,只要您位于某个URL上,就可以创建到套接字服务器的连接。你的套接字服务器与URL无关,套接字是事件流。啊,好吧,我想我是误解了。所以在前端,我只会发出一条消息,说用户访问了我的套接字可以处理的页面,对吗?