【问题标题】:Using spawn function with NODE_ENV=production使用带有 NODE_ENV=production 的 spawn 函数
【发布时间】:2014-01-16 11:45:09
【问题描述】:

我目前正在尝试使用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']);

但是,我收到以下错误;

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)

我怎样才能使用spawn 做到这一点?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    您的usage of spawn 不正确

    spawn( command, args, options ):

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

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

    { cwd: 未定义, env: process.env }

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

    所以环境变量 NODE_ENV 应该在 options 参数中提供

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

    另见How do I debug "Error: spawn ENOENT" on node.js?

    【讨论】:

    • 使用 ES6/7 Stage 3 语法,您可以使用对象扩展语法在一行中完成此操作 - spawn('node', ['app.js'], {...process.env, NODE_ENV: 'test})
    【解决方案2】:

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

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

    或者保留默认的 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});
    

    我的测试:

    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);
    

    从终端:

    node spawn
    

    输出:

    { NODE_ENV: 'production' }
    

    【讨论】:

    • 我已经在我的服务器上测试过了,你确定你可以从终端运行node吗?
    • 我从 iterm 运行,当我使用 console.log(process.env) 时,它会提供 iterm 环境变量。
    • 如果你想使用父进程的环境,不要定义它。
    【解决方案3】:

    这对我有用

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

    这没有

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

    【讨论】:

      【解决方案4】:

      添加 shell 选项对我有用

      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);
          });
      });
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      • 见nodejs api:nodejs.org/api/…
      • 您只是复制并粘贴了没有很好解释的代码。看起来更好,但请解释一下
      • 这个节点官方文档可能会有所帮助:nodejs.org/api/…
      猜你喜欢
      • 1970-01-01
      • 2015-06-20
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      相关资源
      最近更新 更多