设置要检索的节点的环境变量

时间:2014-03-10 22:25:57

标签: node.js environment-variables

我正在尝试按照教程说它:

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

  1. 从环境变量中加载
  2. 从磁盘上的JSON文件加载
  3. 密钥必须如下:

    USER_ID, USER_KEY
    

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

    根据一些谷歌搜索,似乎我需要在process.env中设置变量?我如何以及在何处设置这些凭据?示例请。

16 个答案:

答案 0 :(得分:348)

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

看起来他们只是让您在从USER_ID加载USER_KEYprocess.env或在磁盘上加载某些特定文件之间做出选择。

现在,当你运行应用程序时会发生魔力。

USER_ID=239482 USER_KEY=foobar node app.js

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

答案 1 :(得分:169)

我强烈建议您查看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'文件不是必需的,所以你不必担心你的应用程序在它缺席的情况下会失败。

答案 2 :(得分:89)

只需在命令行上提供env值

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

答案 3 :(得分:62)

您可以通过流程全局变量设置环境变量,如下所示:

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

适用于所有平台。

答案 4 :(得分:49)

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

使用 .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));

答案 5 :(得分:30)

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

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

export FOO=bar

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

Environment variables on ubuntu

答案 6 :(得分:7)

第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

答案 7 :(得分:4)

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

How can i set NODE_ENV=production in Windows?

答案 8 :(得分:4)

遇到了一个很好的工具。

node-env-file

将环境文件(包含ENV变量导出)解析并加载到Node.js环境中,即c:/windows/system32/ and c:/windows/syswow64 - 使用此样式:

process.env

答案 9 :(得分:4)

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
  4. Env文件很好地保存了你不希望在你的代码库中拥有的api-key和其他秘密。只需确保将其添加到.gitignore

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

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

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

    C)使用Windows GUI - 这并不像命令那样酷,但至少它可以工作并创建一个持久变量。

    1. 搜索&#34;环境变量&#34;在“开始菜单搜索”或“控制面板”中
    2. 选择&#34;编辑系统环境变量&#34;
    3. 对话将会开启。单击按钮&#34; Environment Variables&#34;在对话的底部。
    4. 现在你有一个编辑变量的小窗口。只需点击&#34;新&#34;按钮添加新的环境变量。容易。

答案 10 :(得分:2)

随着@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

答案 11 :(得分:2)

我成功使用的环境变量的一种非常好的方法如下:

一个。 拥有不同的配置文件

  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'
    };
    
  4. 注意:值主要随环境而变化,但密钥保持不变。

    1. 你可以有更多

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

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

      <projectRoot>/config/dev.js
      <projectRoot>/config/qa.js
      <projectRoot>/config/z__prod.js
      <projectRoot>/setenv.js
      <projectRoot>/setenv.bat
      <projectRoot>/setenv.sh
      
    4. 注意:prod的名称与其他名称不同,因为它不会被所有人使用。

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

      理想情况下,文件中的这些配置变量应该作为OS环境变量(或LAMBDA函数变量,或Azure函数变量,Google Cloud Functions等)

      所以,我们在Windows OS(或其他)中编写自动化

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

      2. 现在运行“ setenv dev

      3. a)这将从传递的参数变量(现在是'dev')中获取输入 b)读取相应的文件('config \ dev.js')
        c)在Windows OS(或其他)中设置环境变量

        例如,

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

        希望有所帮助。

答案 12 :(得分:0)

设置系统env var后,我得到了未定义。当我将APP_VERSION放入User env var时,我可以通过process.env.APP_VERSION显示来自节点的值

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

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

答案 15 :(得分:-1)

如果您使用的是Mac / Linux,并且想要检索所用计算机的本地参数,则将执行以下操作:

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