JSON.stringify在新创建的对象(节点,javascript)上失败

JSON.stringify在新创建的对象(节点,javascript)上失败,javascript,json,node.js,stringify,Javascript,Json,Node.js,Stringify,好的,这是一个非常简单的问题,但我刚刚开始学习。我也是javascript新手,所以,请不要怜悯我在下面指出错误的方向 我特别有两个文件: 其中一个类在不同的端口中创建一些从属服务器 另一个是生成从属文件的“主”文件 当我试图打印出我刚刚初始化的内容时,会出现两个奇怪的错误: connections属性已弃用。使用getConnections()方法,然后 当我尝试在新对象中应用JSON.stringify(将循环结构转换为JSON)时,它崩溃 文件“slave.js”中的从属代码: 现

好的,这是一个非常简单的问题,但我刚刚开始学习。我也是javascript新手,所以,请不要怜悯我在下面指出错误的方向

我特别有两个文件:

  • 其中一个类在不同的端口中创建一些从属服务器
  • 另一个是生成从属文件的“主”文件
当我试图打印出我刚刚初始化的内容时,会出现两个奇怪的错误:

  • connections属性已弃用。使用getConnections()方法,然后
  • 当我尝试在新对象中应用JSON.stringify(将循环结构转换为JSON)时,它崩溃
文件“slave.js”中的从属代码:

现在,主文件

var http   = require ("http");
var url    = require ("url");
var a      = require ("./slave.js");

var i, temp;
var myArray = new Array ();

for (i = 0; i < 4; i++) {
    var newID = i + 1;
    var newPort = 8000 + i + 1;
    var coordinatorIndicator = false;

    if ((i % 4) == 0) {
        coordinatorIndicator = true; // Say, this is going to be a coordinator
    }

    temp = a.createSlave (newID, coordinatorIndicator, newPort);
    console.log ("New slave is  : " + temp);
    console.log ("Stringified is: " + JSON.stringify(temp));

    myArray.push(temp);
}
var http=require(“http”);
var url=要求(“url”);
var a=需要(“./slave.js”);
变量i,温度;
var myArray=newarray();
对于(i=0;i<4;i++){
var newID=i+1;
var newPort=8000+i+1;
var坐标指示器=假;
如果((i%4)==0){
coordinatorIndicator=true;//比如说,这将是一个协调器
}
temp=a.createSlave(newID、坐标指示器、newPort);
console.log(“新从机为:”+temp);
console.log(“Stringified是:+JSON.stringify(temp));
myArray.push(temp);
}

您正在尝试字符串化http.createServer(…)的结果。这不是您想要做的,因此当您创建该属性时,请使用
Object.defineProperty()
定义它,使其不可枚举


通过这种方式,
JSON.stringify
将不会到达该属性,从而固化其对象的枚举。

问题在于
temp
对象的属性
httpServer
具有循环引用。您可以使用前面的答案中提到的
ecmascript 5
属性定义将其设置为不可枚举,也可以使用的replacer函数对其进行自定义,以避免将
httpServer
属性字符串化

   console.log ("Stringified is: " + JSON.stringify(temp, function(key, value){
         if(key === 'httpServer') return undefined;
        return value;
    }));

您不能仅对任何旧对象进行字符串化。确实,这个对象正在工作,只需稍作更改:命令temp.httpServer.listen(temp.thePort);应该在Object.defineProperty(…)之后。请更改订单。我会再等几分钟,看看是否还有其他答案,然后再接受。谢谢你抽出时间!当然,我改了。我编辑时没有注意到订单。谢谢PSL的时间和其他解释。我很感激。我在用户2736012上同意这一点,因为他名声不好。@maghtymouse欢迎你。。理想情况下,在节点世界中,您应该使用ECMAScript 5定义,这将使它成为定义对象的更标准的方式。因为它已经发布了,所以我只提供了一个备选方案。。您选择了正确的答案:)
exports.createSlave = function (id, coordinatorK, port) {
    var temp         = new Slave ();
    temp.ID          = id;
    temp.coordinator = coordinatorK;
    temp.thePort     = port;

    Object.defineProperty(temp, "httpServer", {
        value: http.createServer(handle_incoming_request),
        enumerable: false, // this is actually the default, so you could remove it
        configurable: true,
        writeable: true
    });
    temp.httpServer.listen (temp.thePort);
    return temp;
}
   console.log ("Stringified is: " + JSON.stringify(temp, function(key, value){
         if(key === 'httpServer') return undefined;
        return value;
    }));