在socket.io中管理用户

时间:2018-05-07 21:38:21

标签: javascript node.js express socket.io

我正在尝试管理我的应用中登录的每个用户的位置/顺序。 我创建了一个每次有人进入时都会更新的数组。 到现在为止,它工作正常。

[...]
var row_of_users=[];//my array of users.
var visits=0;//just a count of users logged in.

io.on('connection', function(socket){
var user=socket.id;
visits++;
row_of_users.push(user);
console.log(row_of_users);
[...]
console.log中的

显示:

[' BnUtfcyNniEWNwN3AAAA',   ' IkE3l4oMBXt5dEsOAAAB&#39 ;,   ' t5gzbSru7oDR44T7AAAC&#39 ;,   ' yB2X4G55YqcvDgHcAAAD' ]

但是当用户离开时,socket.io会忽略user.id并删除数组中的最后一个对象。

socket.on('disconnect', function(){
visits--;
row_of_users.pop(user);
});

如果我在console.log中关闭浏览器中的第一个用户标签(** BnUtfcyNniEWNwN3AAAA ),现在显示:**

[' BnUtfcyNniEWNwN3AAAA',   ' IkE3l4oMBXt5dEsOAAAB&#39 ;,   ' t5gzbSru7oDR44T7AAAC' ]

就像最后一个用户断开连接一样。

这里发生了什么?以及如何正确更新阵列? 我没有发布整个代码,因为我的语言是葡萄牙语,变量也是葡萄牙语。

2 个答案:

答案 0 :(得分:1)

array.pop()不会接受任何参数,并且会始终弹出最后一个元素。

From MDN:

  

pop()方法从数组中删除最后一个元素并返回该元素。

要删除第N个元素,请使用:

array.splice(N, 1)

或者在你的情况下:

row_of_users.splice(row_of_users.indexOf(user), 1)

答案 1 :(得分:0)

你的答案就在这里:How do I remove a particular element from an array in JavaScript?

基本上,您将使用indexOf(socket.id)并从row_of_users数组中拼接该索引。