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

roc*_*mic 8 javascript ipc parent-child child-process node.js

我正在尝试这个:

var child = spawn('node', args, {cwd: parentDir, stdio: 'ipc'} );
Run Code Online (Sandbox Code Playgroud)

(args是一个参数数组)

但它给出以下错误:

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

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

var child = spawn('node', args, {cwd: parentDir} );
Run Code Online (Sandbox Code Playgroud)

这也有效:

 var child = spawn('node', args, {cwd: parentDir, stdio: 'pipe'} );
Run Code Online (Sandbox Code Playgroud)

我读到了这个: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.

Jai*_*mez 6

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

parent.js

spawn('node', ['child.js'], {
    stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
}).on('message', function(data) {
    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
  • 子女与cwd父母一样.
  • inherit用于与子项共享相同的流(如stdout),因此您可以在控制台中查看内容.

child.js

process.send && process.send('hello parent');
Run Code Online (Sandbox Code Playgroud)
  • 如果您要直接使用相同的代码,该功能将不可用(它将是undefined),因此您需要先检查.


bel*_*sys 5

根据我的几次推动,Rockamic 回答了他自己的问题。这是有效的方法和原因:

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

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

如果 rockamic 回来并提供他自己的答案,我会很乐意删除它,以便他可以获得可接受的答案。


bel*_*sys 0

尝试:

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

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

如果不是也许

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

您可能想更改“管道”,或者也解决标准输出...不确定您真正想要什么。

最后,这似乎是一篇很好的文章,可以帮助您获得一些观点。标题看起来不太合适,但如果您阅读代码中发生的事情,我认为这会有所帮助:

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

不要忘记发布结果并帮助其他人具体了解哪些内容有效或您更改了什么...谢谢