尝试在数据对象内部跟踪客户端套接字。
var clients = {'clients':[]};
io.sockets.on('connection', function(socket) {
clients.clients.push(socket);
io.emit('updateUsers', clients);
});
获取此错误: RangeError:超出最大调用堆栈大小。
我认为让客户端成为对象而不是数组会解决调用堆栈错误,但我猜错了...不确定我在这里忽略了什么。
谢谢!
答案 0 :(得分:0)
您已将socket
对象放入要发出的数据中,clients
clients.clients.push(socket);
socket
对象是一个复杂的结构,可能包含循环引用。
io.emit
的工作方式是首先通过执行JSON.stringify(clients)
将需要发送的数据转换为JSON字符串。现在JSON.stringify
无法处理可能具有循环引用的对象。所以that's the cause of your error.
你不应该把像socket
那样复杂的东西放到你想要发出的数据中。您应该只发出最重要的信息。如果您只想发出socket.id
,那么您应该推送
clients.clients.push({id: socket.id})
..或其他此类信息,但保留一个可以转换为JSON字符串的简单对象。