热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在nodejs中管道从子节点到父节点的数据

如何解决《在nodejs中管道从子节点到父节点的数据》经验,为你挑选了1个好方法。

我有一个nodejs父进程启动另一个nodejs子进程.子进程执行一些逻辑,然后将输出返回给父进程.输出很大,我正在尝试使用管道进行通信,如child.send()方法的文档(其工作正常BTW)所示.

我希望有人建议如何正确构建这个沟通渠道.我希望能够将数据从父节点发送到子节点,并且还能够将数据从子节点发送到父节点.我已经开始了一点,但它是不完整的(仅从父节点向子节点发送消息)并抛出错误.

父文件代码:

var child_process = require('child_process');

var opts = {
    stdio: [process.stdin, process.stdout, process.stderr, 'pipe']
};
var child = child_process.spawn('node', ['./b.js'], opts);

require('streamifier').createReadStream('test 2').pipe(child.stdio[3]);

子文件代码:

var fs =  require('fs');

// read from it
var readable = fs.createReadStream(null, {fd: 3});

var chunks = []; 

readable.on('data', function(chunk) {
    chunks.push(chunk);
});

readable.on('end', function() {
    console.log(chunks.join().toString());
})

上面的代码打印预期输出("测试2")以及以下错误:

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: shutdown ENOTCONN
    at exports._errnoException (util.js:746:11)
    at Socket.onSocketFinish (net.js:232:26)
    at Socket.emit (events.js:129:20)
    at finishMaybe (_stream_writable.js:484:14)
    at afterWrite (_stream_writable.js:362:3)
    at _stream_writable.js:349:9
    at process._tickCallback (node.js:355:11)
    at Function.Module.runMain (module.js:503:11)
    at startup (node.js:129:16)
    at node.js:814:3

完整答案:

家长代码:

var child_process = require('child_process');

var opts = {
    stdio: [process.stdin, process.stdout, process.stderr, 'pipe', 'pipe']
};
var child = child_process.spawn('node', ['./b.js'], opts);

child.stdio[3].write('First message.\n', 'utf8', function() {
    child.stdio[3].write('Second message.\n', 'utf8', function() {

    });
}); 

child.stdio[4].pipe(process.stdout);

孩子的代码:

var fs =  require('fs');

// read from it
var readable = fs.createReadStream(null, {fd: 3});

readable.pipe(process.stdout);
fs.createWriteStream(null, {fd: 4}).write('Sending a message back.');

Jasper Woude.. 6

您的代码有效,但是通过使用流化器包从字符串创建读取流,您的通信通道将在传输该字符串后自动关闭,这就是您收到ENOTCONN错误的原因.

为了能够通过流发送多条消息,请考虑使用.write它.你可以随意调用它:

child.stdio[3].write('First message.\n');
child.stdio[3].write('Second message.\n');

如果你想使用这种方法发送多个离散消息(我认为这是基于你child.send()之前使用的注释的情况),最好使用一些分隔符号来在读入流时分割消息孩子 在上面的例子中,我使用换行符.帮助进行此拆分的有用包是事件流.

现在,为了从父级中的子级创建另一个通信通道,只需将另一个"管道"添加到您的stdio.

你可以在孩子写信:

fs.createWriteStream(null, {fd: 4}).write('Sending a message back.');

并从父母那里读取:

child.stdio[4].pipe(process.stdout);

这将打印"发回信息".到控制台.



1> Jasper Woude..:

您的代码有效,但是通过使用流化器包从字符串创建读取流,您的通信通道将在传输该字符串后自动关闭,这就是您收到ENOTCONN错误的原因.

为了能够通过流发送多条消息,请考虑使用.write它.你可以随意调用它:

child.stdio[3].write('First message.\n');
child.stdio[3].write('Second message.\n');

如果你想使用这种方法发送多个离散消息(我认为这是基于你child.send()之前使用的注释的情况),最好使用一些分隔符号来在读入流时分割消息孩子 在上面的例子中,我使用换行符.帮助进行此拆分的有用包是事件流.

现在,为了从父级中的子级创建另一个通信通道,只需将另一个"管道"添加到您的stdio.

你可以在孩子写信:

fs.createWriteStream(null, {fd: 4}).write('Sending a message back.');

并从父母那里读取:

child.stdio[4].pipe(process.stdout);

这将打印"发回信息".到控制台.


推荐阅读
author-avatar
王立君淑霖_189
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有