我目前正在向一个数组添加一个WebSocket客户端对象,以便我可以(通过索引)将其与另一个用户信息数组相匹配,以确定哪个用户属于哪个客户端/套接字/会话。
var users = [];
var clients = [];
...
wss.on('connection', function connection(ws) {
clients.push(ws);
var i = clients.indexOf(ws);
if(i > -1) {
users.push({
id: i,
user: "",
room: "",
client: clients[i],
});
}
ws.on('close', function(ws) {
var i = clients.indexOf(ws); //i = -1
if(i > -1) {
// remove this client and user...
}
});
ws.on('message', function incoming(message) {
// do stuff
});
});
我能够获取ws
对象的索引(返回0),因此我能够将对象作为JSON对象的一部分插入到" users"阵列很好。但是当我尝试在关闭连接时删除相同的ws
对象时,会为-1
返回indexOf(ws)
。但肯定它应该返回0
,因为它与先前使用的对象(连接)相同,并且仍然存在于clients数组中的索引0处?
为什么indexOf()在"关闭"中返回-1处理程序?
答案 0 :(得分:1)
如果您在Node中使用close
模块,则WebSocket
事件侦听器不会将ws
作为其第一个参数。 docs say the first argument is closing code
reason,而不是套接字。
相反,您已在外部ws
变量中拥有套接字。不要用名为ws
的参数来遮蔽它,你的代码应该可以正常工作:
ws.on('close', function(code, message) {
var i = clients.indexOf(ws);
//...
});