node.js - 在 mongodb 中保存未知 JS 对象的字符串表示

标签 node.js mongodb sockets

我在程序中保存连接/套接字对象,如下所示:

var clients = [];
net.createServer(function (socket) {
    clients.push(socket);
    //morecode...

稍后的代码中我使用该数组来广播消息:

function broadcast(message, sender) {
    clients.forEach(function (client) {
        client.write(message);
    });
}

到目前为止非常简单。现在,我想将套接字变量保存在 mongodb 服务器中,以便可以从服务器应用程序的不同实例访问它。我的第一个方法是做类似的事情:

var client = new Client({
    name: socket.remoteAddress + ":" + socket.remotePort,
    socket: JSON.stringify(socket)
});

client.save(function (err) {
    if (err)
        console.log(err);
}); 

但是我得到:TypeError:将循环结构转换为 JSON 我从 SO 中的类似问题得到的建议是使用 util.inspect ,这样我就可以保存套接字变量的字符串表示形式:

console.log(套接字)

Socket {
  _connecting: false,
  _hadError: false,
  _handle:
   TCP {
     _externalStream: {},
     fd: 14,
     reading: true,
     owner: [Circular],
     onread: [Function: onread],
     onconnection: null,
     writeQueueSize: 0 },
  _parent: null,
  _host: null,
  _readableState:
   ReadableState {
     objectMode: false,
     highWaterMark: 16384,
     buffer: [],
     length: 0,
     pipes: null,
     pipesCount: 0,
     flowing: null,
     ended: false,
     endEmitted: false,
     reading: true,
     sync: false,
     needReadable: true,
     emittedReadable: false,
     readableListening: false,
     resumeScheduled: false,
     defaultEncoding: 'utf8',
     ranOut: false,
     awaitDrain: 0,
     readingMore: false,
     decoder: null,
     encoding: null },
  readable: true,
  domain: null,
  _events:
   { end: { [Function: g] listener: [Function: onend] },
     finish: [Function: onSocketFinish],
     _socketEnd: [Function: onSocketEnd] },
  _eventsCount: 3,
  _maxListeners: undefined,
  _writableState:
   WritableState {
     objectMode: false,
     highWaterMark: 16384,
     needDrain: false,
     ending: false,
     ended: false,
     finished: false,
     decodeStrings: false,
     defaultEncoding: 'utf8',
     length: 0,
     writing: false,
     corked: 0,
     sync: true,
     bufferProcessing: false,
     onwrite: [Function],
     writecb: null,
     writelen: 0,
     bufferedRequest: null,
     lastBufferedRequest: null,
     pendingcb: 0,
     prefinished: false,
     errorEmitted: false },
  writable: true,
  allowHalfOpen: false,
  destroyed: false,
  bytesRead: 0,
  _bytesDispatched: 0,
  _sockname: null,
  _pendingData: null,
  _pendingEncoding: '',
  server:
   Server {
     domain: null,
     _events: { connection: [Function] },
     _eventsCount: 1,
     _maxListeners: undefined,
     _connections: 1,
     _handle:
      TCP {
        _externalStream: {},
        fd: 12,
        reading: false,
        owner: [Circular],
        onread: null,
        onconnection: [Function: onconnection],
        writeQueueSize: 0 },
     _usingSlaves: false,
     _slaves: [],
     _unref: false,
     allowHalfOpen: false,
     pauseOnConnect: false,
     _connectionKey: '6::::5000' } }

console.log(util.inspect(socket))

{ socket: 'Socket {\n _connecting: false,\n _hadError: false,\n _handle: \n TCP {\n
_externalStream: {},\n fd: 14,\n reading: true,\n owner: [Circular],\n onread: [Function: onread],\n onconnection: null,\n writeQueueSize: 0 },\n _parent: null,\n _host: null,\n _readableState: \n ReadableState {\n objectMode: false,\n highWaterMark: 16384,\n buffer: [],\n length: 0,\n pipes: null,\n pipesCount: 0,\n flowing: null,\n ended: false,\n endEmitted: false,\n reading: true,\n sync: false,\n
needReadable: true,\n emittedReadable: false,\n
readableListening: false,\n resumeScheduled: false,\n
defaultEncoding: \'utf8\',\n ranOut: false,\n awaitDrain: 0,\n readingMore: false,\n decoder: null,\n encoding: null },\n readable: true,\n domain: null,\n _events: \n { end: { [Function: g] listener: [Function: onend] },\n finish: [Function: onSocketFinish],\n _socketEnd: [Function: onSocketEnd] },\n _eventsCount: 3,\n _maxListeners: undefined,\n _writableState: \n WritableState {\n objectMode: false,\n highWaterMark: 16384,\n needDrain: false,\n ending: false,\n ended: false,\n
finished: false,\n decodeStrings: false,\n defaultEncoding: \'utf8\',\n length: 0,\n writing: false,\n corked: 0,\n
sync: true,\n bufferProcessing: false,\n onwrite: [Function],\n writecb: null,\n writelen: 0,\n
bufferedRequest: null,\n lastBufferedRequest: null,\n
pendingcb: 0,\n prefinished: false,\n errorEmitted: false },\n writable: true,\n allowHalfOpen: false,\n destroyed: false,\n bytesRead: 0,\n _bytesDispatched: 0,\n _sockname: null,\n _pendingData: null,\n _pendingEncoding: \'\',\n server: \n Server {\n domain: null,\n _events: { connection: [Function] },\n
_eventsCount: 1,\n _maxListeners: undefined,\n _connections: 1,\n _handle: \n TCP {\n _externalStream: {},\n
fd: 12,\n reading: false,\n owner: [Circular],\n
onread: null,\n onconnection: [Function: onconnection],\n
writeQueueSize: 0 },\n _usingSlaves: false,\n _slaves: [],\n
_unref: false,\n allowHalfOpen: false,\n pauseOnConnect: false,\n _connectionKey: \'6::::5000\' },\n _peername: { address: \'::ffff:XXXXXXX\', family: \'IPv6\', port: 1145 },\n' }' }

以这种形式,我可以将其保存到 mongodb,但我不知道如何将其重新转换为 Nodejs 可以使用的套接字对象

最佳答案

Another work around解决TypeError:将循环结构转换为JSON,自定义JSON.stringify如下

var cache = [];
var obj = JSON.stringify(sock, function(key, value) {
    if (typeof value === 'object' && value !== null) {
        if (cache.indexOf(value) !== -1) {
            // Circular reference found, discard key
            return;
        }
        // Store value in our collection
        cache.push(value);
    }
    return value;
});
cache = null; // Enable garbage collection

console.log(obj);

所以很容易通过JSON.parse将其重新转换为套接字对象

console.log(JSON.parse(obj));

关于node.js - 在 mongodb 中保存未知 JS 对象的字符串表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35386048/

相关文章:

c语言通过指定文件进行客户端socket连接

node.js - 我可以在我的 Chrome 打包应用程序中使用 socket.io 吗?

node.js - 填充调用后模拟 Mongoose 对象

linux - 在 Linux 上安装 tar.gz

mongodb - 无法到达设置 mongo 配置服务器的任何节点

java - MongoDB聚合Spring/Java(带有数组、分组和匹配的项目)

python - 在 SSL wrap() 之前在原始套接字上接收/发送,Python

python - 使用 UDP 套接字将 C++ 结构转换为 Python

node.js - LocalStrategy 函数从未被调用

javascript - 如何使用 nodejs(加密)生成 32 字节的 SHA256 哈希,以避免 tweetnacl.js 抛出错误的 key 大小错误?