2013-09-10 3 views
2

Хорошо, этот вопрос должен быть очень простым, но я только начал изучать узел. Я также новичок в javascript, поэтому, пожалуйста, не проявляйте милосердия, указав неправильные направления ниже.JSON.stringify не удается создать новый объект (узел, javascript)

В частности, у меня есть два файла:

  • один имеет класс, который создает несколько подчиненных серверов в разных портах
  • другой является «основной» файл, который создает рабов

Когда я пытаюсь распечатать то, что я только что инициализировал, я получаю две странные ошибки:

  • connect иона является устаревшей. Используйте метод getConnections(), а затем
  • он выходит из строя при попытке применить JSON.stringify в новом объекте (Преобразование круговой структуры JSON)

Код для рабов в файл «slave.js»:

var http = require ("http"); 

function Slave() { 
} 

Slave.prototype.ID   = undefined; 
Slave.prototype.coordinator = false; 
Slave.prototype.httpServer = undefined; 
Slave.prototype.thePort  = undefined; 

Slave.prototype.isCoordinator = function() { return this.coordinator; } 

/*****************************************************************/ 

function handle_incoming_request (req, res) { 
    console.log("INCOMING REQUEST: " + req.method + " " + req.url); 
    res.writeHead (200, { "Content-Type" : "application/json" }); 
    res.end(JSON.stringify({ "error" : null }) + "\n"); 
} 

exports.createSlave = function (id, coordinatorK, port) { 
    var temp   = new Slave(); 
    temp.ID   = id; 
    temp.coordinator = coordinatorK; 
    temp.thePort  = port; 
    temp.httpServer = http.createServer(handle_incoming_request); 
    temp.httpServer.listen (temp.thePort); 
    console.log ("Slave (" + (temp.isCoordinator() ? "coordinator" : "regular") + ") with ID " + temp.ID + " is listening to port " + temp.thePort); 
    console.log ("--------------------------------------------"); 

    return temp; 
} 

Теперь, основной файл.

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); 
} 
+3

Вы не можете стягивать только любой старый объект. – Pointy

ответ

3

Вы пытаетесь укрепить результат http.createServer(...). Это не то, что вы хотите сделать, поэтому, создав это свойство, сделайте его неперечислимым, определив его с помощью Object.defineProperty().

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; 
} 

Таким образом JSON.stringify не достигнет этого имущества леча его перечисление объекта.

+0

Это правда, что этот работает с небольшими изменениями: команда temp.httpServer.listen (temp.thePort); должен быть после Object.defineProperty (...). Пожалуйста, измените этот заказ. Я подожду еще несколько минут, чтобы узнать, есть ли еще ответ, прежде чем я его приму. Спасибо за ваше время! – MightyMouse

+0

Конечно, я изменил его. Не замечал приказ, когда я редактировал. – user2736012

1

проблема есть с недвижимостью httpServertemp объект с круглой ссылкой. Вы можете либо установить его без перечисления с использованием определения свойства Ecmascript5, как указано в предыдущем ответе, либо вы можете использовать функцию-заменитель JSON.stringify, чтобы настроить его, чтобы не укрепить свойство httpServer.

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

Спасибо PSL за ваше время и альтернативное объяснение. Я ценю это. Я предоставляю это на user2736012, потому что он ниже по репутации. – MightyMouse

+0

@MightyMouse Добро пожаловать. Идеально в мире узлов вы должны пойти с определениями EcmaScript5, которые сделают его более стандартным способом определения объектов. Поскольку он уже был отправлен, я просто предоставил альтернативу. Вы выбрали правильный ответ .. :) – PSL

Смежные вопросы