NodeJS - how to get spawned child to communicate with parent?
Solution 1
Here's a full example, slightly different from the other answers:
parent.js
spawn('node', ['child.js'], {
stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
}).on('message', function(data) {
console.log(data);
});
- Child shares same
cwd
as the parent. inherit
is used to share the same streams (likestdout
) with the child, so you can see stuff in your console for example.
child.js
process.send && process.send('hello parent');
- If you're going to use the same code directly, the function won't be available (it'll be
undefined
), so you need to check first.
Solution 2
Rockamic answered his own question, based on a couple of my nudges. Here's what worked & why:
var child = spawn('node', args, {cwd: parentDir, stdio: [null, null, null, 'ipc']} );
specifying stdin, stdout, stderr, as null indicates default...
If rockamic comes back and provides his own answer, I will gladly delete this so he can get the accepted answer.
rockamic
Updated on June 14, 2022Comments
-
rockamic almost 2 years
I'm trying this out:
var child = spawn('node', args, {cwd: parentDir, stdio: 'ipc'} );
(args is an array of parameters)
but it gives the following error:
TypeError: Incorrect value of stdio option: ipc
This actually works, so the problem seems indeed to be the stdio ipc parameter:
var child = spawn('node', args, {cwd: parentDir} );
This also works:
var child = spawn('node', args, {cwd: parentDir, stdio: 'pipe'} );
I read this: http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options but I don't see where I am going wrong. This is the first time I try to use this NodeJS functionality so I am sorry if the problem is evident.
Maybe there is some other way to solve the problem. The child has to be spawned and not forked and I simply want to be able to send messages from the child to the parent.
Thank you!!
EDIT: I have Node v0.8.18. I searched version history for IPC http://nodejs.org/changelog.html and there's nothing with search term "IPC" that makes me think that I need a newer version of NodeJS.
-
rockamic over 10 yearsThanks bellasys. Actually, I changed the initial code that I posted here (I simplified it) and instead of putting the actual variable there which I used that was an array I put the generic js name but you're right. Here's my actual code: child[port] = spawn('node', args, {cwd: parentDir, stdio: 'ipc'} ); I'll edit the original post. Thanks.
-
bellasys over 10 yearsI edited my answer suggesting a more robust treatment of your stdio: option. placing 'ipc' in the last slot e.g. [0,1,2,'ipc'] still gets you .send() and on('message') as you requested. If you are still having trouble, it's likely your context for this line is the trouble,not the line itself... FYI I referenced docs for your current version of Node (0.8.18) and 'ipc' seems valid for your version...
-
rockamic over 10 yearsBellasys, I just saw your edit and have been toying around it for a few minutes now. That link gave me an idea (to look more into FDs) and here's what finally solved it: child[port] = spawn('node', args, {cwd: parentDir, stdio: [null, null, null, 'ipc'] } ); So yes, it was helpful indeed. THANK YOU! Have an excellent day.
-
bellasys over 10 years@rockamic you can post your own answer to your own question. I suggest you do so for future overflowerz