2015-11-02 16 views
8

Mam problem z modułem procesu potomnego, w szczególności z child.spawn i child.fork. ja opierając się na dokumentacji child_process.fork, który mówi:Jak przekazywać wiadomości i standardowe wyjście z potomka do elementu nadrzędnego w module procesu potomnego node.js?

This is a special case of the child_process.spawn() functionality for spawning Node.js processes. In addition to having all the methods in a normal ChildProcess instance, the returned object has a communication channel built-in. See child.send(message, [sendHandle]) for details.

mam uproszczona mój problem poniżej:

parent.js jest:

var cp = require('child_process'); 
var n = cp.fork('./child.js'); 
n.send({a:1}); 
//n.stdout.on('data',function (data) {console.log(data);}); 
n.on('message', function(m) { 
    console.log("Received object in parent:"); 
    console.log(m); 
}); 

child.js jest:

process.on('message', function(myObj) { 
    console.log('myObj received in child:'); 
    console.log(myObj); 
    myObj.a="Changed value"; 
    process.send(myObj); 
}); 
process.stdout.write("Msg from child"); 

Zgodnie z oczekiwaniami. Dane wyjściowe to:

Msg from child 
myObj received in child: 
{ a: 1 } 
Received object in parent: 
{ a: 'Changed value' } 

Chcę, aby działało z komentarzem wiersza w pliku parent.js, który nie jest zaznaczony. Innymi słowy, chcę złapać stdout w procesie dziecko w n.stdout.on („dane” ... oświadczenie w procesie macierzystym Gdybym odkomentowaniu go, otrzymuję komunikat o błędzie.

n.stdout.on('data',function (data) {console.log(data);}); 
    ^
TypeError: Cannot read property 'on' of null 

Nie mam nic przeciwko używaniu jakichkolwiek asynchronicznych wariacji procesu potomnego, exec, fork lub spawn. Wszelkie sugestie:

+0

Czy ktoś może wyjaśnić - dlaczego wolisz słuchacza 'message' zamiast' danych' podczas przesyłania strumieniowego ... danych? – ymz

Odpowiedz

17

Musisz ustawić właściwość cichy na obiekcie opcji, gdy przekażesz go do fork() w celu dla stdin, stdout i stderr, aby uzyskać połączenie z powrotem do procesu nadrzędnego:

np. var n = cp.fork('./child.js', [], { silent: true });

+0

Nawiasem mówiąc, czy istnieje sposób na odczytanie tych dzienników i przetworzenie ich podczas używania '{cichy: prawda}'? – Kunok

Powiązane problemy