58

I'm currently trying to run process using spawn. What I am trying to run from shell is the following;

NODE_ENV=production node app/app.js

Here's the code to run that;

var spawn = require('child_process').spawn;
var start = spawn('NODE_ENV=production',['node','app/app.js']);

However, I got the following error;

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: spawn ENOENT
    at errnoException (child_process.js:980:11)
    at Process.ChildProcess._handle.onexit (child_process.js:771:34)

How can I do that using spawn ?

4 Answers 4

117

Your usage of spawn is not correct:

spawn( command, args, options ):

Launches a new process with the given command, with command line arguments in args. If omitted, args defaults to an empty Array.

The third argument is used to specify additional options, which defaults to:

{ cwd: undefined, env: process.env }

Use env to specify environment variables that will be visible to the new process, the default is process.env.

So the env variable NODE_ENV should be provided on the options argument:

// ES6 Object spread eases extending process.env
spawn( 'node', ['app.js'], { env: { ...process.env, NODE_ENV: 'test' } })

See also How do I debug "Error: spawn ENOENT" on node.js?

Sign up to request clarification or add additional context in comments.

1 Comment

With ES6/7 Stage 3 syntax you can do this in one line using object spread syntax - spawn('node', ['app.js'], {...process.env, NODE_ENV: 'test})
16

Syntax: spawn(command, [args], [options])

var spawn = require('child_process').spawn;
var start = spawn('node', ['app.js'], {env: {NODE_ENV: 'production'}});

Or keep default ENV variables:

var spawn = require('child_process').spawn;

var productionEnv = process.env; // TODO should clone process.env like utils.extend
productionEnv.NODE_ENV = 'production';

var start = spawn('node', ['app.js'], {env: productionEnv});

My test:

app.js

console.log(process.env);

spawn.js

var spawn = require('child_process').spawn;
var start = spawn('node', ['app.js'], {env: {NODE_ENV: 'production'}});

start.stdout.pipe(process.stdout);

from terminal:

node spawn

output:

{ NODE_ENV: 'production' }

3 Comments

I have test this on my server, are you sure you can run node from terminal?
I'm running from iterm, when I use console.log(process.env), it gives iterm environment variables.
If you want to use the parent process' environment, just leave it undefined.
8

This worked for me

var spawn = require('child_process').spawn;
var productionEnv = Object.create(process.env);
productionEnv.NODE_ENV = 'production';
var start = spawn('node', ['app.js'], {env: productionEnv});

this did not

var spawn = require('child_process').spawn;
var start = spawn('node', ['app.js'], {env: {NODE_ENV: 'production'}});

2 Comments

I don't understand anything. I have this console.log: console.log({ NODE_ENV: process.env.NODE_ENV, env: process.env }), and NODE_ENV gives 'development', but env is an object that has NODE_ENV as 'production'. I don't understand what could be happening?
@AralRoca I'm very curious to know what this is when you find out. My best guess is that something else is interfering.
0

add shell option worked for me

gulp.task('xxx', function (callback) {
    process.chdir('xxx/');
    var spawn = require('child_process').spawn;
    var productionEnv = Object.create(process.env);
    // var jekyll = spawn('gulp', ['stylecheck'], {stdio: 'inherit', env: productionEnv});
    var jekyll = spawn('gulp', ['stylecheck'], {stdio: 'inherit', env: productionEnv, shell: true});

    jekyll.on('exit', function (code) {
        console.log(arguments);
    });
});

4 Comments

While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
see nodejs api: nodejs.org/api/…
You just copied and pasted the code which doesn't explained well. Looks like better one but please explain it
this nodes official docs may help: nodejs.org/api/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.