Как передавать сообщения, а также stdout от дочернего к родительскому в модуле дочернего процесса node.js?

У меня проблема с модулем дочернего процесса, особенно с child.spawn и child.fork. Я полагаюсь на документацию child_process.fork, в которой говорится:

Это особый случай функции child_process.spawn() для нереста Node.js процессов. В дополнение к тому, что все методы в обычный экземпляр ChildProcess, возвращаемый объект имеет связь канальный встроенный. Подробнее см. Child.send(message, [sendHandle]).

Я упростил мою проблему ниже:

parent.js:

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:

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");

Как и ожидалось. Выход:

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

Я хочу, чтобы он работал с прокомментированной строкой в ​​parent.js uncommented. Другими словами, я хочу поймать stdout в дочернем процессе в файле n.stdout.on('data'... в родительском процессе. Если я раскомментирую его, я получаю сообщение об ошибке:

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

Я не против использования каких-либо асинхронных вариантов дочернего процесса, exec, fork или spawn. Любые предложения?

Ответ 1

Вам нужно установить свойство silent в объекте options, когда вы передаете его в fork(), чтобы stdin, stdout и stderr возвращались обратно к родительскому процессу.

например. var n = cp.fork('./child.js', [], { silent: true });

Ответ 2

spawn('stdbuf', ['-i0', '-o0', '-e0', "./test-script" ]);