【问题标题】:NodeJS: trouble emitting array inside object to clientNodeJS:无法将对象内的数组发送到客户端
【发布时间】:2015-06-12 14:48:27
【问题描述】:

尝试自己在数据对象中跟踪客户端套接字。

var clients = {'clients':[]};

io.sockets.on('connection', function(socket) {
    clients.clients.push(socket);
    io.emit('updateUsers', clients);
});

收到此错误:RangeError: 超出最大调用堆栈大小。

我认为将客户端设置为对象而不是数组可以解决调用堆栈错误,但我猜我错了……不知道我在这里忽略了什么。

谢谢!

【问题讨论】:

    标签: javascript arrays node.js object


    【解决方案1】:

    您已将 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 字符串的简单对象。

    【讨论】:

    • 啊,我明白了。阅读循环引用的东西,现在它是有道理的。然后我应该能够发出 socket.id ,这将满足我的需求。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2018-02-13
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多