【问题标题】:How to pass messages as well as stdout from child to parent in node.js child process module?如何在 node.js 子进程模块中将消息和标准输出从子进程传递给父进程?
【发布时间】:2016-02-02 09:35:57
【问题描述】:

我遇到了子进程模块的问题,特别是 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 中未注释的注释行一起使用。换句话说,我想在父进程的 n.stdout.on('data'... 语句中捕获子进程中的标准输出。如果我取消注释它,我会收到错误:

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

我不介意使用任何子进程异步变体、exec、fork 或 spawn。有什么建议吗?

【问题讨论】:

  • 有人可以解释一下 - 为什么在流式传输...数据时更喜欢 message 侦听器而不是 data

标签: node.js fork child-process spawn


【解决方案1】:
spawn('stdbuf', ['-i0', '-o0', '-e0', "./test-script" ]);

【讨论】:

    【解决方案2】:

    在将选项对象传递给 fork() 时,您需要在选项对象上设置静默属性,以便标准输入、标准输出和标准错误通过管道返回父进程。

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

    【讨论】:

    • 顺便问一下,有没有办法在使用{silent:true}时读取这些日志并处理它们?
    • @Kunok 根据我刚刚的尝试,您可以使用n.stdout.on('data', (data) => { // do something with data })(如果您没有使用{ silent: true },您将无法使用)
    猜你喜欢
    • 2015-12-12
    • 2010-11-19
    • 2013-01-03
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2022-01-15
    相关资源
    最近更新 更多