NodeJS - 如何让衍生的孩子与父母沟通?

时间:2014-01-24 22:05:36

标签: javascript node.js ipc parent-child child-process

我正在尝试这个:

var child = spawn('node', args, {cwd: parentDir, stdio: 'ipc'} );

(args是参数数组)

但它会出现以下错误:

  

TypeError:stdio选项的值不正确:ipc

这实际上有效,所以问题似乎确实是stdio ipc参数:

var child = spawn('node', args, {cwd: parentDir} );

这也有效:

 var child = spawn('node', args, {cwd: parentDir, stdio: 'pipe'} );

我读到了这个:http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options 但我不知道我哪里错了。这是我第一次尝试使用这个NodeJS功能,所以如果问题很明显,我很抱歉。

也许有其他方法可以解决问题。孩子必须被产生而不是分叉,我只是希望能够将孩子的信息发送给父母。

谢谢!

编辑:我有Node v0.8.18。我搜索了IPC http://nodejs.org/changelog.html的版本历史记录,搜索词“IPC”没有任何内容让我觉得我需要更新版本的NodeJS。

3 个答案:

答案 0 :(得分:6)

这是一个完整的例子,与其他答案略有不同:

<强> parent.js

spawn('node', ['child.js'], {
    stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
}).on('message', function(data) {
    console.log(data);
});
  • 儿童与父母共享cwd
  • inherit用于与孩子共享相同的流(如stdout),因此您可以在控制台中查看相关内容。

<强> child.js

process.send && process.send('hello parent');
  • 如果您要直接使用相同的代码,该功能将无法使用(它将是undefined),因此您需要先检查。

答案 1 :(得分:3)

Rockamic根据我的一些推动回答了他自己的问题。这是什么工作&amp;原因如下:

 var child = spawn('node', args, {cwd: parentDir, stdio: [null, null, null, 'ipc']} );

指定stdin,stdout,stderr,因为 null 表示默认...

如果rockamic回来并提供了自己的答案,我很乐意将其删除,以便他能得到接受的答案。

答案 2 :(得分:0)

尝试:

var child = spawn('node', ['childnodejsscript.js'], {cwd: parentDir, stdio: 'ipc'} );

(在您的arg中添加括号,应该是一个数组)并查看是否会改变您的错误 -

如果不是

var child = spawn('node', ['childnodejsscript.js'], {cwd: parentDir, stdio: ['pipe', 1, 2, 'ipc']} );

你可能想要改变'pipe',或者也可以解决stdout ...不确定你真正想要的是什么。

最后,这似乎是一个很好的帖子,可以帮助你获得一些观点。标题似乎不合适,但如果您阅读代码中发生的事情,我认为它会有所帮助:

http://blog.trevnorris.com/2013/07/child-process-multiple-file-descriptors.html

不要忘记发布结果&amp;帮助其他人,特别是有效的或改变了什么...... thx