nodejs: child_process.spawn not reporting exit code

While writting unit tests for a simple tool, I was unable to get the process exit code of a child process started with require('child_process').spawn. To simplify if down, consider this simple node command which exits with code 35:

SHELL> node -e "process.exit(35)" &
[1] 23427
[1]+  Saída 35               node -e "process.exit(35)"

Now consider the following file, where the command above is executed with exec and with spawn. The target is catching the exit code:

SHELL> cat WTF.js 
var cp = require('child_process');

cp.exec('node -e "process.exit(35);"', function(err){
  console.log('child exit code (exec)', err.code);
});

cp.spawn('node', ['-e', '"process.exit(35);"']).on('exit', function(code){
  console.log('child exit code (spawn)', code);
});

But when it's run... surprise:

SHELL> node WTF.js
child exit code (exec) 35
child exit code (spawn) 0

Am I missing something about the spawn call?

SHELL> node --version 
v6.0.0

Remove the double quotes from the second parameter for spawn(), the spawn() will automatically take care of making sure the parameter is not accidentally separated due to spaces, etc:

cp.spawn('node', ['-e', 'process.exit(35);'])
  .on('exit', function(code){
    console.log('child exit code (spawn)', code);
  });

Otherwise node treats the passed (js) code literally as "process.exit(35);" (a string literal) which is basically a no-op and so it exits with code 0.