У меня есть родительский процесс nodejs, который запускает другой дочерний процесс nodejs. Дочерний процесс выполняет некоторую логику, а затем возвращает результат родительскому процессу. Вывод большой, и я пытаюсь использовать каналы для связи, как это предлагается в документации для метода child.send() (который, кстати, отлично работает).
Хотелось бы, чтобы кто-нибудь подсказал, как правильно построить этот канал связи. Я хочу иметь возможность отправлять данные от родителя к ребенку, а также иметь возможность отправлять данные от ребенка к родителю. Я немного запустил его, но он неполный (отправляет сообщение только от родителя к дочернему) и выдает ошибку.
Код родительского файла:
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.');