我正在尝试node.js/socket。IO和遇到一些奇怪的事情时,连接和断开到插座。io服务器。
插座。IO版本1.0.6Node.js版本0.10.29Express version 4.7.2
我将连接存储到我在app.js顶部声明的JavaScript对象/数组中,我想稍后向其添加用户对象。每次连接时,我都会向这个数组中添加一些东西,每次断开时,我都会移除它。服务器代码:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var connections = {}; // in here I want to store my connections
app.set('view engine', 'ejs');
app.get('/', function(req, res) {
res.render(__dirname + '/views/index.ejs');
});
app.get('/something', function(req, res) {
res.render(__dirname + '/views/something.ejs');
// socket.io connetion
io.on('connection', function(socket) {
// HERE is the PROBLEM
connections[socket.id] = "user object will come here"; // add user object to connections
console.log('======== connection added ========');
console.log(connections);
socket.on('disconnect', function() {
delete connections[socket.id]; // remove from connections
console.log('======== connection removed ========');
console.log(connections);
});
});
});
server.listen(3000);
然而,问题是,每次建立一个新的连接,它将做"这里是问题的评论"之后的代码,但比我开始的连接,即使它们是关闭/断开。
例如:
我通过在浏览器中输入localhost:3000/什么来启动连接。然后,它将打印以下内容到终端(我的意思是执行代码):
...
console.log('======== connection added ========');
console.log(connections);
看起来不错,当console.log(connections)
时,它将显示一个连接但是当我开始另一个连接时,它会做:
...
console.log('======== connection added ========');
console.log(connections);
...
console.log('======== connection added ========');
console.log(connections);
连接对象将显示正确的连接数量,这不是问题。但是它把它打印了两次到控制台!为什么? !
然后当我关闭浏览器或浏览器选项卡时,我断开连接并执行以下代码:
delete connections[socket.id]; // remove from connections
console.log('======== connection removed ========');
console.log(connections);
delete connections[socket.id]; // remove from connections
console.log('======== connection removed ========');
console.log(connections);
connections对象将显示1个连接,这是正确的,但它被打印了两次。如果我启动一个新的连接,将有2个连接,它将打印"连接添加+连接"3次,它应该只打印一次。因此,如果我启动10个连接,关闭9个连接并启动一个新连接,我将有2个连接正在进行,它将打印"connection added + connections"11次…
io.on('connection', function(socket) {});
将为每个启动的连接运行已启动的连接数量(即使它们已关闭很长时间)。对不起,我的英语很差,描述很长,但现在不知道如何"命名"这个问题。
移动插座。IO code out of
app.get('/something', function(req, res) {//code here});
并将其放在server.listen(3000)之后似乎已经解决了这个问题。然而,我想有一个插座。IO连接仅在某一页。我该怎么做呢?