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

我这样声明:

var sockets = {};

然后,当创建一个新的套接字时,我将该套接字添加到我的sockets对象中;
sockets[socket.name] = socket;

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

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

我试图将其保存到这样的文件中:
    var outputFilenameee = 'sockets.json';

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

    });

但我收到此错误:



以下是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' } }

如何将其存储在文件中?

最佳答案



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

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

关于javascript - TypeError : Converting circular structure to JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18559332/

10-09 20:37