NodeJS - how to get spawned child to communicate with parent?

12,197

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 cwdas the parent.
  • inherit is used to share the same streams (like stdout) 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.

Share:
12,197
rockamic
Author by

rockamic

Updated on June 14, 2022

Comments

  • rockamic
    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
    rockamic over 10 years
    Thanks 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
    bellasys over 10 years
    I 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
    rockamic over 10 years
    Bellasys, 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
    bellasys over 10 years
    @rockamic you can post your own answer to your own question. I suggest you do so for future overflowerz