rockamic
rockamic

Reputation: 181

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

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.

Upvotes: 14

Views: 16222

Answers (3)

Jaime Gomez
Jaime Gomez

Reputation: 7067

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.

Upvotes: 13

bellasys
bellasys

Reputation: 309

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.

Upvotes: 5

bellasys
bellasys

Reputation: 309

try:

var child = spawn('node', ['childnodejsscript.js'], {cwd: parentDir, stdio: 'ipc'} );

(adding brackets to your arg which is supposed to be an array) and see if that alters your error-

if not perhaps

var child = spawn('node', ['childnodejsscript.js'], {cwd: parentDir, stdio: ['pipe', 1, 2, 'ipc']} );

And you may want to alter 'pipe', or address the stdout as well... not sure what you really want here.

finally, this seems like a good post to help you get some perspective. The title doesn't seem like a fit, but if you read what is happening in the code I think it'll be helpful:

http://blog.trevnorris.com/2013/07/child-process-multiple-file-descriptors.html

Don't forget to post results & help others with specifically what worked or what you changed... thx

Upvotes: 0

Related Questions