【问题标题】:io.sockets.clients() gives error "Converting circular structure to JSON"io.sockets.clients() 给出错误“将循环结构转换为 JSON”
【发布时间】:2013-11-25 17:17:56
【问题描述】:

我正在尝试使用以下代码将 io.sockets.clients() 的内容传递给客户端:

var room_users = io.sockets.clients(newroom);
socket.emit('update_room_users', room_users);

(newroom 是一个字符串变量)

但我得到了错误:

将循环结构转换为 JSON

在控制台中。

我不知道为什么会这样,因为根据 socket.io 网站,这应该是正确的代码?

【问题讨论】:

标签: javascript json node.js websocket socket.io


【解决方案1】:

您不能将包含循环引用的对象转换为 JSON。 循环引用是一个包含自身的对象。

循环引用示例:

var a = {};
var b = {a:a};
a.b = b;

room_users 当然包含循环引用,因为它包含引用其他客户端的套接字客户端...


对不起,我的英语不好。

【讨论】:

  • 我以为“io.sockets.clients()”只是一个包含客户端数据的对象?我理解循环引用,但我看不出它在这里是如何明显的......愚蠢的大脑!但似乎您根本无法将“io.sockets.clients()”传递给客户端(是的,因为循环引用),但我只想知道为什么?!
  • 你到底想了解什么?为什么不能传递循环引用或为什么io.sockets.clients() 包含循环引用?
  • 后者,因此,前者:)
  • 更抽象地说,将服务器端客户端对象传递给客户端是没有意义的。它包含自身和其他客户端的所有客户端-服务器连接引用。对于安全性来说,这不是一个好主意。你为什么要传递这个对象?
  • 回答你的问题。在 Socket.IO API 中,您不能从具有属性broadcast 的客户端对象向其他客户端发送消息。为此,客户端对象需要在其关联的服务器上有一个引用。并且服务器包含所有客户端的引用。现在的客户也是。并且每个客户端都包含服务器的引用。这是一个无限循环。 ;-)
猜你喜欢
  • 2019-01-31
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 2018-09-17
  • 2020-05-31
  • 1970-01-01
  • 2018-06-08
  • 2021-10-23
相关资源
最近更新 更多