Имам родителски процес на 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.');