【问题标题】:TypeError: Converting circular structure to JSONTypeError:将循环结构转换为 JSON
【发布时间】:2013-09-01 14:22:48
【问题描述】:

在我的应用程序中,我正在创建一个对象来跟踪所有套接字;

我这样声明:

var sockets = {};

然后,当创建一个新套接字时,我将套接字添加到我的 sockets 对象;

sockets[socket.name] = socket;

这是我的应用程序逻辑所必需的。而且效果很好。

我遇到的问题是,由于我的服务器有时会重新启动,我想将 sockets 对象存储到文件中(用于备份目的)。如果发生重启,我不希望活动套接字丢失。

我尝试将它保存到这样的文件中:

    var outputFilenameee = 'sockets.json';

    fs.writeFile(outputFilenameee, JSON.stringify(sockets), function(err) {
        if(err) {
          console.log(err);
        } else {
          console.log("sockets saved in " + outputFilenameee);
        }           

    });

但我收到此错误:

TypeError:将循环结构转换为 JSON

下面是sockets的console.log:

{ '217.208.204.18:63695': 
   { domain: null,
     _events: { data: [Function], end: [Function] },
     _maxListeners: 10,
     _handle: 
      { writeQueueSize: 0,
        owner: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 0,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     errorEmitted: false,
     bytesRead: 125,
     _bytesDispatched: 0,
     allowHalfOpen: false,
     writable: true,
     readable: true,
     server: 
      { domain: null,
        _events: [Object],
        _maxListeners: 10,
        _connections: 1,
        connections: [Getter/Setter],
        allowHalfOpen: false,
        _handle: [Object],
        _connectionKey: '4:0.0.0.0:8080' },
     _peername: { address: '217.208.204.18', family: 'IPv4', port: 63695 },
     name: '217.208.204.18:63695' } }

如何将其存储在文件中?

【问题讨论】:

  • 您必须做出选择。您不能完全按原样存储它。你想存储什么,更重要的是,为什么?您不能从文件转储中“恢复”套接字。
  • 我需要恢复它才能做到:sockets[socketName].write('a message')
  • 有没有其他方法可以保存它们并在服务器再次重新启动时将其拾取?
  • 如果服务器重新启动,那么 客户端 将不得不重新打开套接字。

标签: javascript json node.js sockets


【解决方案1】:

如果发生重启,我不希望活动套接字丢失

抱歉,鉴于操作系统的进程模型,这是不可避免的。当进程退出时,操作系统会释放和回收您进程的资源,包括网络套接字、打开的文件、内存等。

为了实现这样的目的,您需要一个单独的负载平衡器或集群管理器,以在一个集群节点/工作器重新启动时保持原始套接字处于活动状态。您可能想研究 node.js 集群模块,但鉴于您尝试通过将套接字写入磁盘来做到这一点,您在此级别上对操作系统的理解存在一些差距,您可能需要在冒险之前进行更多研究在常规应用程序逻辑之外。

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 2016-01-22
    • 2017-06-29
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2020-08-18
    • 2013-06-14
    相关资源
    最近更新 更多