我刚刚开始玩socket.io并尝试制作一些超级简单的东西,就像人们连接房间一样。
我希望这能给我房间里的客户数量
io.sockets.on('connection', function (socket){
socket.on('create or join', function (channel) {
var numClients = io.sockets.clients(channel).length;
...
}
})
但它返回错误:Object #<Namespace> has no method 'clients'
因为V.1中的某些内容已发生变化。经过一些搜索后,我用另一个搜索替换了回调:
var clients = io.sockets.adapter.rooms[channel];
var numClients = 0;
if (typeof clients !== 'undefined'){
numClients = clients.length;
}
p(numClients); // p is just a wrapper on console.log()
p(clients);
socket.join(channel);
socket.emit('created', channel);
但无论我连接多少次,我都会得到0作为客户端数量:
0
undefined
0
[ hSxLuOqrm5bX4UxmAAAA: true ]
0
[ hSxLuOqrm5bX4UxmAAAA: true, '2bjYS0lrUFySPM1OAAAB': true ]
我做错了什么?
P.S。以下是如何获得会议室中客户的数量:
var numClients = (typeof clients !== 'undefined') ? Object.keys(clients).length : 0;
答案 0 :(得分:5)
这是因为clients
数组存储的套接字不是索引键,而是使用字符串键(如对象)。
为了演示这一点,请查看以下代码:
var clients = [];
clients.somekey1 = true;
clients.somekey2 = true;
console.log(clients.length);
console.log(clients);
这是输出:
0
[ somekey1: true, somekey2: true ]
此数组的实际长度为0
,尽管其中包含属性。因此,您应该将clients
数组视为一个对象,从而计算此对象中的客户端数量&#34;可以使用以下代码行执行:
var numClients = Object.keys(clients).length;
Object.keys()
方法返回给定对象自身可枚举属性的数组,其顺序与for...in
循环提供的顺序相同(差异)因为for-in循环也枚举了原型链中的属性。
这正是我们所需要的。