Node.js 在mongodb中保存未知JS对象的字符串表示形式
我正在程序中保存连接/套接字对象,如下所示:Node.js 在mongodb中保存未知JS对象的字符串表示形式,node.js,mongodb,sockets,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)
var clients = [];
net.createServer(function (socket) {
clients.push(socket);
//morecode...
稍后的代码中,我使用该数组来广播消息:
function broadcast(message, sender) {
clients.forEach(function (client) {
client.write(message);
});
}
到目前为止非常简单。现在,我想将socket变量保存在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中的一个类似问题中得到的一个建议是使用,这样我就可以保存套接字变量的字符串表示形式:
控制台日志(套接字)
console.log(util.inspect(socket))
{socket:'套接字{\n\u正在连接:
false,\n\u HADEROR:false,\n\u句柄:\n TCP{\n_外部流:{},\n fd:14,\n reading:true,\n owner:[循环],\n onread:[函数:onread],\n onconnection: 空,\n writeQueueSize:0},\n\u父项:空,\n\u主机:空,\n _readableState:\n readableState{\n objectMode:false\n highWaterMark:16384\n buffer:[],\n length:0\n管道: null,\n管道提示:0,\n流动提示:null,\n结束提示:false,\n 提交:错误,\n读取:正确,\n同步:错误,\n
needReadable:true\n emittedReadable:false\n
可读侦听:错误,\n恢复计划:错误,\n
defaultEncoding:\'utf8\',\n范围:false,\n范围:0,\n readingMore:false,\n解码器:null,\n编码:null},\n 可读:true,\n域:null,\n\u事件:\n{end:{[函数: g] 侦听器:[函数:onend]}\n完成:[函数: onSocketFinish],\n\u socketEnd:[函数:onSocketEnd]},\n _EventScont:3\n\u maxListeners:undefined\n\u writableState:\n writableState{\n objectMode:false\n highWaterMark:16384\n needDrain:false,\n ending:false,\n ended:false,\n
已完成:false,\n解码字符串:false,\n默认编码: \“utf8\”,\n长度:0,\n书写:假,\n软木塞:0,\n
同步:真,\n缓冲处理:假,\n写入: [函数],\n writeb:null,\n writelen:0,\n
bufferedRequest:null\n lastBufferedRequest:null\n
pendingcb:0,\n预完成:false,\n错误发出:false},\n 可写:true,\n AllowAlfOpen:false,\n已销毁:false,\n 字节读取:0\n\u字节发送:0\n\u sockname:null\n _pendingData:null\n\u PendingCodeing:\'\',\n服务器:\n服务器{\n域:null\n\u事件:{连接:[函数]},\n
_eventsCount:1,\n\u maxListeners:未定义,\n\u连接:1,\n\u句柄:\n TCP{\n\u外部流:{},\n
fd:12,\n读数:假,\n所有者:[循环],\n
onread:null\n onconnection:[函数:onconnection],\n
writeQueueSize:0},\n\u使用从属:false,\n\u从属:[],\n
_unref:false、\n AllowAlfOpen:false、\n pauseOnConnect:false、\n\u连接键:\'6:::5000\'}、\n\u对等名称:{地址: \“::ffff:XXXXXXX\”,系列:\'IPv6\,端口:1145},\n'} 在这种形式下,我可以将其保存到mongodb,但我不知道如何将其重新转换为socket对象NodeJ可以使用来解决
类型错误:将循环结构转换为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));
要解决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));
我怀疑这是可能的
net.Socket
使用TCP套接字,您基本上希望两个不同的进程同时使用同一个套接字。您找到解决方案了吗?我怀疑这是可能的<代码>网络套接字使用TCP套接字,您基本上希望两个不同的进程同时使用同一个套接字。您找到解决方案了吗?这不起作用,因为您在解析此类对象后返回的对象不再是套接字对象。这不起作用,因为您在解析此类对象后返回的对象不再是套接字对象。