Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.JS-未能从package.json跨脚本导出环境变量_Javascript_Node.js_Express_Environment Variables - Fatal编程技术网

Javascript Node.JS-未能从package.json跨脚本导出环境变量

Javascript Node.JS-未能从package.json跨脚本导出环境变量,javascript,node.js,express,environment-variables,Javascript,Node.js,Express,Environment Variables,我正在创建一个基于Express的Node.JS项目,并尝试设置环境变量,以将开发和生产流程分开。我创建了一个shell脚本文件,其中包含一些环境变量,如NODE_env或DEBUG,当我在命令行上运行npm run develop时,将由predevelop脚本执行,但是在Express应用程序运行时,predevelop完成其执行并获得未定义的后,变量丢失 这是/scripts/development.sh #!/bin/sh echo 'Setting up development en

我正在创建一个基于Express的Node.JS项目,并尝试设置环境变量,以将开发和生产流程分开。我创建了一个shell脚本文件,其中包含一些环境变量,如
NODE_env
DEBUG
,当我在命令行上运行
npm run develop
时,将由
predevelop
脚本执行,但是在Express应用程序运行时,
predevelop
完成其执行并获得
未定义的
后,变量丢失

这是
/scripts/development.sh

#!/bin/sh

echo 'Setting up development env';

export NODE_ENV='development';
export NODE_DEBUG='http';
export DEBUG='project:server';

echo 'NODE_ENV => '$NODE_ENV;
echo 'NODE_DEBUG => '$NODE_DEBUG;
echo 'DEBUG => '$DEBUG;

exit 0;
这是我的
package.json
脚本

{
  // ...
  "scripts": {
    "predevelop": "/bin/bash ./scripts/development.sh",
    "develop": "echo 'NODE_ENV => '$NODE_ENV && echo 'NODE_DEBUG => '$NODE_DEBUG && echo 'DEBUG => '$DEBUG; node ./bin/www"
  }
  // ...
}
来自
npm run develope
的控制台输出:

┌─ [ jcorradi ] ~/Sites/pocs/project-server  
└─• npm run develop

> project-server@0.0.0 predevelop /home/jcorradi/Sites/pocs/project-server
> /bin/bash ./scripts/development.sh

Setting up development env
NODE_ENV => development
NODE_DEBUG => http
DEBUG => project:server

> project-server@0.0.0 develop /home/jcorradi/Sites/pocs/project-server
> echo 'NODE_ENV => '$NODE_ENV && echo 'NODE_DEBUG => '$NODE_DEBUG && echo 'DEBUG => '$DEBUG; node ./bin/www

NODE_ENV =>
NODE_DEBUG =>
DEBUG =>

// From ./bin/www
NODE_ENV => undefined
NODE_DEBUG => undefined
DEBUG => undefined
有人知道这是否是最好的做法,或者是否有其他方法使这项工作

Obs:我已经尝试直接在npm脚本上设置环境变量,但仍然失败

例:


如果你不想像上面提到的那样传递参数,你可以这样做

package.json

"scripts": {
    "start": ". development.sh | node path/to/app/www"
}
在项目根目录中运行“npm start”(也假设development.sh位于项目根目录中)。这将执行development.shbash脚本,然后执行节点脚本

注二:

  • 我记得阅读上面的语法时可能会稍微依赖于您的操作系统/节点版本。因此,如果你遇到任何问题,请将其考虑在内

  • 此外,在节点脚本中,环境变量将是流程对象上的键/值。这将有助于了解调试目的

  • 有人知道这是否是最好的做法,或者是否有其他方法使这项工作

    最好的做法是避免在package.json中设置环境变量,因为这应该与环境无关,以便支持没有bash或在
    /usr/bin/bash

    假设您不关心该约束,那么实现该功能的方法是在实际运行命令中执行您的环境:

    {
      "scripts": {
        "develop": "NODE_ENV=development NODE_DEBUG=http DEBUG=project:server node ./bin/www"
      }
    } 
    

    是否有任何理由不通过命令行将变量传递给节点。例如,“predevelop”:“node myScript.js pre”和“develop”:“node myScript.js dev”。然后让脚本处理传递到process.argv数组中的命令行参数?因为它是环境变量,而不是执行参数。例如,Express使用节点_ENV来控制缓存和日志。调试也一样,只适用于
    morgam
    lognpm包。
    {
      "scripts": {
        "develop": "NODE_ENV=development NODE_DEBUG=http DEBUG=project:server node ./bin/www"
      }
    }