Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS-如何让生成的子节点与父节点通信?_Javascript_Node.js_Ipc_Parent Child_Child Process - Fatal编程技术网

Javascript NodeJS-如何让生成的子节点与父节点通信?

Javascript NodeJS-如何让生成的子节点与父节点通信?,javascript,node.js,ipc,parent-child,child-process,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,

我正在尝试:

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'} );
我读到: 但我看不出我错在哪里。这是我第一次尝试使用这个NodeJS功能,所以如果问题很明显,我很抱歉

也许还有别的办法解决这个问题。子对象必须是派生的,而不是分叉的,我只是希望能够从子对象向父对象发送消息

谢谢

编辑:我有节点v0.8.18。我搜索了IPC的版本历史记录,没有任何搜索词“IPC”让我认为我需要更新版本的NodeJS。

试试:

var child = spawn('node', ['childnodejsscript.js'], {cwd: parentDir, stdio: 'ipc'} );
(将括号添加到你的arg中,它应该是一个数组),看看这是否会改变你的错误-

如果不是,也许

var child = spawn('node', ['childnodejsscript.js'], {cwd: parentDir, stdio: ['pipe', 1, 2, 'ipc']} );
您可能需要更改“管道”,或者也可以寻址标准输出。。。我不知道你到底想要什么

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


别忘了公布结果&具体帮助他人做些什么或者你改变了什么。。。基于我的几次轻推,thxRockamic回答了他自己的问题。以下是成功的原因:

 var child = spawn('node', args, {cwd: parentDir, stdio: [null, null, null, 'ipc']} );
将stdin、stdout、stderr指定为null表示默认值


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

以下是一个完整的示例,与其他答案略有不同:

parent.js

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

spawn('node', ['child.js'], {
    stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
}).on('message', function(data) {
    console.log(data);
});
process.send && process.send('hello parent');
  • 如果要直接使用相同的代码,该函数将不可用(它将是
    未定义的
    ),因此需要先检查

您需要指定stdio选项吗?我想是的。否则,默认情况下它什么也不做(从我在上面文本中输入的链接)。下面是关于IPC的说明:“IPC”-创建一个IPC通道,用于在父级和子级之间传递消息/文件描述符。一个子进程最多可以有一个IPC标准文件描述符。设置此选项将启用ChildProcess.send()方法。如果子进程将JSON消息写入此文件描述符,则将触发ChildProcess.on('message')。如果子项是Node.js程序,则IPC通道的存在将启用process.send()和process.on('message')。谢谢。实际上,我更改了我在这里发布的初始代码(我简化了它),并没有将我使用的实际变量放在那里,而是放在了一个数组中,我使用了通用的js名称,但你是对的。下面是我的实际代码:child[port]=spawn('node',args,{cwd:parentDir,stdio:'ipc'});我将编辑原始帖子。谢谢。我编辑了我的答案,建议对你的stdio:选项进行更有力的治疗。将“ipc”放置在最后一个插槽中,例如[0,1,2,'ipc']仍然可以按照您的请求执行.send()和on('message')。如果你仍然有问题,这句话的上下文可能是问题,而不是这句话本身。。。仅供参考,我引用了您当前版本的Node(0.8.18)的文档,“ipc”似乎对您的版本有效…Bellasys,我刚刚看到了您的编辑,现在已经玩了几分钟了。这个链接给了我一个想法(更多地研究FDs),下面是最终解决这个问题的方法:child[port]=spawn('node',args,{cwd:parentDir,stdio:[null,null,null,'ipc']});所以,是的,这确实很有帮助。非常感谢。祝你度过愉快的一天。@rockamic你可以发布你自己问题的答案。我建议你这样做是为了将来的飞越