【问题标题】:Setting Environment Variables for Node to retrieve为节点设置环境变量以检索
【发布时间】:2014-04-14 07:03:50
【问题描述】:

我正在尝试遵循一个教程,它说:

有几种方法可以加载凭据。

  1. 从环境变量加载,
  2. 从磁盘上的 JSON 文件加载,

键需要如下:

USER_ID, USER_KEY

...这意味着如果您正确设置了环境变量,您 根本不需要在您的应用程序中管理凭据。

根据一些谷歌搜索,看来我需要在process.env 中设置变量?如何以及在哪里设置这些凭据?请举例。

【问题讨论】:

    标签: node.js environment-variables


    【解决方案1】:

    环境变量(在这种情况下)用于将凭据传递给您的应用程序。 USER_IDUSER_KEY 都可以分别从 process.env.USER_IDprocess.env.USER_KEY 访问。您无需编辑它们,只需访问它们的内容即可。

    看起来他们只是让您选择从process.env 或磁盘上的某个特定文件加载您的USER_IDUSER_KEY

    现在,当您运行应用程序时,奇迹就会发生。

    USER_ID=239482 USER_KEY=foobar node app.js

    这将传递用户 ID 239482 和用户密钥 foobar。这适用于测试,但对于生产,您可能需要配置一些 bash 脚本来导出变量。

    【讨论】:

    • 如果你使用fish而不是bash,你需要使用:env USER_ID=239482 my_command。比如为node.js的debug库设置环境变量:env DEBUG='*' node some_file.jsfishshell.com/docs/current/faq.html#faq-single-env
    • 我发现我必须删除 "*" 周围的引号才能正常工作:env DEBUG=* node some_file.js
    • @SamT 如何在 Ubuntu linux 中设置这些变量?
    • 是否可以添加文件而不是添加大量 env 脚本或 unix 用户需要创建 bash 脚本?
    • @mibbit 是的,这就是dotenv 的全部意义所在,因为它会读取您的.env 文件并应用它。
    【解决方案2】:

    我强烈建议查看 dotenv 包。

    https://github.com/motdotla/dotenv

    它有点类似于@Benxamin 的答案中建议的库,但它更简洁,不需要任何 bash 脚本。另外值得注意的是,代码库很受欢迎且维护良好。

    基本上你需要一个 .env 文件(我强烈建议从你的 git/mercurial/etc 中忽略它):

    FOO=bar
    BAZ=bob
    

    然后在您的应用程序入口文件中尽早放入以下行:

    require('dotenv').config();
    

    轰隆隆。完毕。 'process.env' 现在将包含上述变量:

    console.log(process.env.FOO);
    // bar
    

    '.env' 文件不是必需的,因此您无需担心您的应用在缺少它时会摔倒。

    【讨论】:

    • 尽管如果您确实放置了您的应用程序需要的相关配置详细信息(例如这个问题正在询问),那么它可能会在没有它的情况下崩溃.. 但它似乎仍然是一个不错的选择.
    • 如果您正在寻找额外的安全性,那么 github.com/rolodato/dotenv-safe 和一些测试应该可以做到。
    • 如果您不想在应用程序中要求它:github.com/direnv/direnv
    • 这意味着在 git repo 中提交你的秘密
    • 我不建议这样做。这应该仅适用于您的本地环境,并且文件应该是 gitignore'd。 CI/CD 应该为其他环境注入环境变量。
    【解决方案3】:

    可以通过进程全局变量设置环境变量,如下:

    process.env['NODE_ENV'] = 'production';
    

    适用于所有平台。

    【讨论】:

    • ... 环境变量旨在从代码外部设置,而不是在内部设置 - 所以这违背了目的并且是一个坏例子
    • @Soren 我们启动子进程的节点程序受益于这个答案,所以即使它有点不正统,也有一些用例
    • @pspi -- 我 99% 确定 你做错了 除非你是 config package 的作者,比如 this,否则你应该使用这样的而是配置包。
    • 如果您在 js 中编写构建脚本并从 npm 运行它们,这将非常有用
    • 这对于例如在运行测试时设置和覆盖环境。
    【解决方案4】:

    只需在命令行上提供环境值

    USER_ID='abc' USER_KEY='def' node app.js
    

    【讨论】:

    • 只是补充一点,它在带有 bash shell(cygwin;我认为安装了 git 工具)的 Windows 上对我有用。
    • @TiborSzasz:Cygwin 或 Powershell 应该可以解决这个问题。当然,这是两年后提到的。
    • 对于 Windows 使用:SET USER_ID='abc'
    • @Mike,你应该做出正确的回答:)
    • 我们可以使用跨环境包(npmjs.com/package/cross-env)使其在unix或windwos上工作
    【解决方案5】:

    如果您需要管理选项,请尝试 envs npm 包。如果已设置,它将返回环境值。否则,您可以指定存储在全局 defaults 对象变量中的默认值(如果它不在您的环境中)。

    使用 .env(“dot ee-en-vee”)或环境文件有很多好处。个人可以管理自己的配置。您可以使用自己的环境设置将不同的环境(dev、stage、prod)部署到云服务。您可以设置合理的默认值。

    在您的 .env 文件中,每一行都是一个条目,如下例所示:

    NODE_ENV=development
    API_URL=http://api.domain.com
    TRANSLATION_API_URL=/translations/
    GA_UA=987654321-0
    NEW_RELIC_KEY=hi-mom
    SOME_TOKEN=asdfasdfasdf
    SOME_OTHER_TOKEN=zxcvzxcvzxcv
    

    您应该在您的版本控制存储库中包含.env(将其添加到您的.gitignore 文件中)。

    要将.env 文件中的变量导入您的环境,您可以在启动应用程序之前使用 bash 脚本执行与export NODE_ENV=development 等效的操作。

    #!/bin/bash
    while read line; do export "$line";
    done <source .env
    

    然后这进入你的应用程序 javascript:

    var envs = require('envs');
    
    // If NODE_ENV is not set, 
    // then this application will assume it's prod by default.
    app.set('environment', envs('NODE_ENV', 'production')); 
    
    // Usage examples:
    app.set('ga_account', envs('GA_UA'));
    app.set('nr_browser_key', envs('NEW_RELIC_BROWSER_KEY'));
    app.set('other', envs('SOME_OTHER_TOKEN));
    

    【讨论】:

    • 嗯,我尝试使用这个包,但它似乎只跟踪环境变量的使用。它不读取 .env 文件 (npmjs.com/package/envs)。它是一个正确的包吗?
    • 你是对的!它不读取 .env 文件。这很尴尬。我忘记了我正在使用@SamT提到的bash脚本加载.env,所以它仍然有效。
    • "需要('envs')"?什么是“环境”?
    • 'envs' 是节点模块的名称:npmjs.com/package/envs
    • 另外我推荐使用“dotenv”模块,它把所有的 ENV 变量都放到了 proccess 对象中,顺便说一下很整洁。
    【解决方案6】:

    这取决于你的操作系统和你的 shell

    在带有 shell bash 的 linux 上,您可以像这样(在控制台中)创建环境变量:

    export FOO=bar
    

    更多关于 ubuntu 环境变量的信息(例如):

    Environment variables on ubuntu

    【讨论】:

    • 然后看到这个答案:stackoverflow.com/questions/135688/…
    • 那么 Windows 呢?你能在这里补充一下吗?
    • 啊,没关系,好​​像在这里回答了:stackoverflow.com/questions/9249830/…
    • 在 Linux bash 中这些值是否保持不变?如果我只想在终端打开时运行它,以便以后不会导致其他应用程序出现问题,该怎么办?
    • 这非常适合我的需要 - 我的 npm install --save geo-ip 需要环境键=值设置才能安装。
    【解决方案7】:

    Windows 用户:注意!这些命令推荐用于 Unix,但在 Windows 上它们只是临时的。他们只为当前的 shell 设置一个变量,一旦你重启你的机器或启动一个新的终端 shell,它们就会消失。

    • SET TEST="hello world"
    • $env:TEST = "hello world"

    要在 Windows 上设置持久性环境变量,您必须改用以下方法之一:

    A) 项目中的 .env 文件 - 这是最好的方法,因为这意味着您可以将项目移动到其他系统,而无需在该系统上设置您的环境变量。运行你的代码。

    1. 在您的项目文件夹根目录中创建一个.env 文件,内容为:TEST="hello world"

    2. 编写一些将读取该文件的节点代码。我建议安装 dotenv (npm install dotenv --save),然后在您的节点设置代码中添加 require('dotenv').config();

    3. 现在您的节点代码将能够访问process.env.TEST

    Env 文件可以很好地保存 api 密钥和其他您不想在代码库中包含的秘密。只需确保将其添加到您的 .gitignore 即可。

    B) 使用 Powershell - 这将创建一个可在其他终端中访问的变量。但请注意,重新启动计算机后该变量会丢失。

    [Environment]::SetEnvironmentVariable("TEST", "hello world", "User")

    这种方法在 Windows 论坛上被广泛推荐,但我认为人们不知道该变量在系统重启后不会持续存在......

    C) 使用 Windows GUI

    1. 在开始菜单搜索或控制面板中搜索“环境变量”
    2. 选择“编辑系统环境变量”
    3. 将打开一个对话框。点击对话框底部的“环境变量”按钮。
    4. 现在您有了一个用于编辑变量的小窗口。只需单击“新建”按钮即可添加新的环境变量。简单。

    【讨论】:

      【解决方案8】:

      就像 ctrlplusb 说的,我建议你使用包dotenv,但另一种方法是创建一个 js 文件并在应用服务器的第一行要求它。

      env.js:

      process.env.VAR1="foo"
      process.env.VAR2="bar"
      

      app.js:

      require('./env') // env.js relative path.
      console.log(process.env.VAR1) // foo
      

      【讨论】:

      • 我收到错误消息 Error: Cannot find module 'env'
      • 应该是require('./env')
      【解决方案9】:

      第 1 步:将您的环境变量添加到相应的文件中。例如,您的暂存环境可以称为 .env.staging,其中包含特定于您的暂存环境的环境变量 USER_IDUSER_KEY

      第 2 步:在您的 package.json 文件中,添加以下内容:

      "scripts": {
        "build": "sh -ac '. ./.env.${REACT_APP_ENV}; react-scripts build'",
        "build:staging": "REACT_APP_ENV=staging npm run build",
        "build:production": "REACT_APP_ENV=production npm run build",
        ...
      }
      

      然后像这样在你的部署脚本中调用它:

      npm run build:staging
      

      超级简单的设置,就像一个魅力!

      来源: https://medium.com/@tacomanator/environments-with-create-react-app-7b645312c09d

      【讨论】:

      • @JohnXiao 怎么样?
      【解决方案10】:

      对于 Windows 用户来说,这个 Stack Overflow 问题和最佳答案对于如何通过命令行设置环境变量非常有用

      How can i set NODE_ENV=production in Windows?

      【讨论】:

        【解决方案11】:

        遇到了一个很好的工具。

        node-env-file

        将环境文件(包含 ENV 变量导出)解析并加载到 Node.js 环境中,即process.env - 使用这种样式:

        .env
        
        # some env variables
        
        FOO=foo1
        BAR=bar1
        BAZ=1
        QUX=
        # QUUX=
        

        【讨论】:

          【解决方案12】:

          dotenv-webpack 让您的生活更轻松。只需安装它npm install dotenv-webpack --save-dev,然后在应用程序的根目录中创建一个.env 文件(记得在git push 之前将其添加到.gitignore)。打开此文件,并在其中设置一些环境变量,例如:

          ENV_VAR_1=1234
          ENV_VAR_2=abcd
          ENV_VAR_3=1234abcd
          

          现在,在你的 webpack 配置中添加:

          const Dotenv = require('dotenv-webpack');
          const webpackConfig = {
            node: { global: true, fs: 'empty' }, // Fix: "Uncaught ReferenceError: global is not defined", and "Can't resolve 'fs'".
            output: {
              libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
            },
            plugins: [new Dotenv()]
          };
          module.exports = webpackConfig; // Export all custom Webpack configs.
          

          只需要const Dotenv = require('dotenv-webpack');plugins: [new Dotenv()],当然还有module.exports = webpackConfig; // Export all custom Webpack configs.。但是,在某些情况下,您可能会遇到一些错误。对于这些,您也有解决方案,暗示您可以如何修复某些错误。

          现在,您可以在应用程序中简单地使用process.env.ENV_VAR_1process.env.ENV_VAR_2process.env.ENV_VAR_3

          【讨论】:

            【解决方案13】:

            作为@ctrlplusb 答案的扩展,
            我建议你也看看env-dot-prop 包。

            它允许您使用dot-pathprocess.env 设置/获取属性。

            假设您的process.env 包含以下内容:

            process.env = {
              FOO_BAR: 'baz'
              'FOO_?': '42'
            }
            

            然后你可以像这样操作环境变量:

            const envDotProp = require('env-dot-prop');
            
            console.log(process.env);
            //=> {FOO_BAR: 'baz', 'FOO_?': '42'}
            
            envDotProp.get('foo');
            //=> {bar: 'baz', '?': '42'}
            
            envDotProp.get('foo.?');
            //=> '42'
            
            envDotProp.get('foo.?', {parse: true});
            //=> 42
            
            envDotProp.set('baz.foo', 'bar');
            envDotProp.get('', {parse: true});
            //=> {foo: {bar: 'baz', '?': 42}, baz: {foo: 'bar'}}
            
            console.log(process.env);
            //=> {FOO_BAR: 'baz', 'FOO_?': '42', BAZ_FOO: 'bar'}
            
            envDotProp.delete('foo');
            envDotProp.get('');
            //=> {baz: {foo: 'bar'}}
            
            console.log(process.env);
            //=> {BAZ_FOO: 'bar'}
            

            这可以帮助您解析环境变量并将它们用作应用中的配置对象。
            它还可以帮助您实现12-factor configuration

            【讨论】:

              【解决方案14】:

              我已经成功使用过的一个很好的环境变量处理方法如下:

              A. 有不同的配置文件

              1. dev.js // 这包含所有开发环境变量
                该文件包含:

                module.exports = {
                 ENV: 'dev',
                 someEnvKey1 : 'some DEV Value1',
                 someEnvKey2 : 'some DEV Value2'
                };
                
              2. stage.js // 这包含所有开发环境变量

                ..
                
              3. qa.js // 这包含仅用于 qa 测试的所有环境变量
                该文件包含:

                module.exports = {
                 ENV: 'dev',
                 someEnvKey1 : 'some QA Value1',
                 someEnvKey2 : 'some QA Value2'
                };
                

              注意:大部分情况下,值会随着环境而变化,但键保持不变。

              1. 你可以拥有更多

              2. z__prod.js // 这包含所有用于生产/实时的环境变量
                注意:此文件永远不会捆绑部署

              3. 将所有这些配置文件放在 /config/ 文件夹中

                <projectRoot>/config/dev.js
                <projectRoot>/config/qa.js
                <projectRoot>/config/z__prod.js
                <projectRoot>/setenv.js
                <projectRoot>/setenv.bat
                <projectRoot>/setenv.sh
                

              注意:prod 的名称与其他名称不同,因为它不会被所有人使用。

              B. 从配置文件中设置 OS/ Lambda/ AzureFunction/ GoogleCloudFunction 环境变量

              现在理想情况下,文件中的这些配置变量应该作为操作系统环境变量(或者,LAMBDA 函数变量,或者,Azure 函数变量,谷歌云函数等)

              所以,我们在 Windows 操作系统(或其他)中编写自动化

              1. 假设我们编写 'setenv' bat 文件,该文件接受一个参数,即我们要设置的环境

              2. 现在运行“setenv dev

              a) 这会从传递的参数变量中获取输入(现在为“dev”)
              b) 读取对应文件('config\dev.js')
              c) 在 Windows 操作系统(或其他)中设置环境变量

              例如,

              setenv.bat 的内容可能是:

                  node setenv.js
              

              setenv.js 的内容可能是:

                  // import "process.env.ENV".js file (dev.js example)
                  // loop the imported file contents
                  //     set the environment variables in Windows OS (or, Lambda, etc.)
              

              就是这样,您的环境已经可以使用了。

              当你执行 'setenv qa' 时,所有 qa 环境变量都可以从 qa.js 中使用,并可供同一程序使用(它总是要求 process.env.someEnvKey1,但它得到的价值是 qa one)。

              希望对您有所帮助。

              【讨论】:

                【解决方案15】:

                如果您使用的是 mac/linux,并且您想将本地参数检索到您正在使用的机器上,您可以这样做:

                1. 在终端运行 nano ~/.bash_profile
                2. 添加如下一行:export MY_VAR=var
                3. 保存并运行 source ~/.bash_profile
                4. 在节点中使用如下:console.log(process.env.MY_VAR);

                【讨论】:

                • 这正是我想要的。谢谢
                【解决方案16】:

                设置系统环境变量后,我变得不确定。当我将 APP_VERSION 放入 User env var 中时,我可以通过 process.env.APP_VERSION 显示来自节点的值

                【讨论】:

                  【解决方案17】:

                  如果您使用 Visual Studio 代码调试功能,您可以添加 "envFile": "${workspaceRoot}/.env" 来启动配置。这样你就不必使用 dotenv。

                  {
                          "cwd": "${workspaceRoot}",
                          "command": "npm start",
                          "name": "Run be",
                          "request": "launch",
                          "type": "node-terminal",
                          "envFile": "${workspaceRoot}/.env"
                  },
                  

                  【讨论】:

                    【解决方案18】:

                    使用跨环境。它会为您省去很多麻烦

                    npm i -S cross-env

                    cross-env PARAM=value node ./index.js

                    这通常对非凭据有好处。对于凭据和密钥之类的东西 最好不要存储硬编码的用户 ID 和密码,而是使用不在 repo 中的 .env 文件和 dotenv

                    【讨论】:

                      猜你喜欢
                      • 2023-03-24
                      • 2019-06-10
                      • 2021-03-09
                      • 2021-11-16
                      • 1970-01-01
                      • 2019-07-31
                      • 2018-12-02
                      相关资源
                      最近更新 更多