作者:王立君淑霖_189 | 来源:互联网 | 2023-05-18 18:47
我有一个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);
这将打印"发回信息".到控制台.