使用带有NODE_ENV = production的spawn函数

aac*_*kin 29 node.js

我目前正在尝试使用spawn.我试图从shell运行的是以下内容;

NODE_ENV=production node app/app.js

这是运行它的代码;

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

但是,我收到了以下错误;

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)
Run Code Online (Sandbox Code Playgroud)

我该怎么做spawn呢?

lac*_*ass 60

对spawn的使用不正确:

spawn( command, args, options ):

使用给定命令启动新进程,使用args中的命令行参数.如果省略,则args默认为空数组.

第三个参数用于指定其他选项,默认为:

{cwd:undefined,env:process.env}

使用env指定新进程可见的环境变量,默认为process.env.

所以应该在options参数上提供env变量NODE_ENV:

// clone the actual env vars to avoid overrides
var env = Object.create( process.env );
env.NODE_ENV = 'test';
spawn( 'node', ['app.js'], { env: env } );
Run Code Online (Sandbox Code Playgroud)

另请参见如何在node.js上调试"错误:生成ENOENT"?

  • 使用ES6/7 Stage 3语法,您可以使用对象扩展语法在一行中执行此操作 - "spawn('node',['app.js'],{... process.env,NODE_ENV:'test}) (5认同)

dam*_*hat 11

语法:spawn(command,[args],[options])

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

或者保留默认的ENV变量:

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});
Run Code Online (Sandbox Code Playgroud)

我的测试:

app.js

console.log(process.env);
Run Code Online (Sandbox Code Playgroud)

spawn.js

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

start.stdout.pipe(process.stdout);
Run Code Online (Sandbox Code Playgroud)

从终端:

node spawn
Run Code Online (Sandbox Code Playgroud)

输出:

{ NODE_ENV: 'production' }
Run Code Online (Sandbox Code Playgroud)


Joh*_*apa 6

这对我有用

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

这没有

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