设置环境变量以供节点检索


414

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

有几种加载凭据的方法。

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

密钥需要如下:

USER_ID, USER_KEY

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

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

Answers:


397

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

看起来他们只是给你加载你的选择USER_ID,并USER_KEY从任一process.env或磁盘上的一些specificed文件。

现在,当您运行应用程序时,魔术就发生了。

USER_ID=239482 USER_KEY=foobar node app.js

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


26
如果您使用fish代替bash,则需要使用:env USER_ID=239482 my_command。例如,要为node.js的debug库设置环境变量:env DEBUG='*' node some_file.js fishshell.com/docs/current/faq.html#faq-single-env
SilentSteel 2014年

1
我发现我必须删除“ *”周围的引号才能起作用:env DEBUG=* node some_file.js
divillysausages 2015年

@SamT如何在Ubuntu Linux中设置这些变量?
Mohammed Zameer

1
是否可以添加文件而不是添加大量的环境脚本,或者Unix用户是否需要创建bash脚本?
mibbit

@mibbit是的,这dotenv就是全部,因为它将读取您的.env文件并应用它。
balexandre

200

我强烈建议您查看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'文件,因此您无需担心应用程序在没有应用程序的情况下掉下来。


1
尽管如果您确实输入了应用所需的相关配置详细信息(例如,正在询问的问题),那么在缺少该配置的情况下它可能会崩溃。.但是,它似乎仍然是一个不错的选择。
约翰

6
如果您正在寻找额外的安全性,请访问github.com/rolodato/dotenv-safe并进行一些测试。
ctrlplusb

1
如果您不想在您的应用程序中要求它:github.com/direnv/direnv
AlecRust 2016年

100

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

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

2
只需补充说,它在使用bash shell(cygwin;我认为使用git工具安装)的Windows上对我有用。
markau

@TiborSzasz:Cygwin或Powershell应该解决该问题。当然,两年后会提到这一点。
Orlando marinella

9
对于Windows使用:SET USER_ID ='abc'–
Mike

@Mike,您应该做出一个正确的答案:)
rocketspacer

6
我们可以使用cross-env软件包(npmjs.com/package/cross-env)使它在unix或windwos上运行
Brij

78

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

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

适用于所有平台。


22
...环境变量旨在从代码的设置外,没有indside -所以这次击败的目的和一个坏榜样
索伦

44
@Soren我们的启动子进程的节点程序从此答案中受益,因此,尽管有些
不合常规

2
@pspi -我99%肯定你正在做的是错误的,除非你是一个笔者的配置包这样,你应该使用这样的配置包来替代。
索伦

17
如果您要用js编写构建脚本并从npm运行它们,这将非常有用
Stephen Drew

28
这对于例如运行测试时设置和覆盖环境也很有用。
mtkopone

54

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

使用.env(“ dot ee-en-vee”)或环境文件是有好处的,原因有很多。个人可以管理自己的配置。您可以使用自己的环境设置将不同的环境(开发,阶段,产品)部署到云服务。您可以设置合理的默认值。

.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文件中的变量进入您的环境,可以export NODE_ENV=development在启动应用程序之前使用bash脚本执行等效的操作。

#!/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));

1
嗯,我尝试使用此程序包,但它似乎仅跟踪环境变量的使用情况。它不会读取.env文件(npmjs.com/package/envs)。这是正确的包装吗?
wawka

1
你是对的!它不会读取.env文件。这很尴尬。我忘了我是用bash脚本加载.env的,如@SamT所述,所以无论如何它都可以工作。
沙明2015年

1
“需要('envs')”?什么是“ envs”?
科迪·布格斯坦(CodyBugstein)2016年

1
“ envs”是节点模块的名称:npmjs.com/package/envs
Benxamin

4
我也建议使用“ dotenv”模块,它将所有ENV变量都放入proccess对象中,顺便说一句。
布鲁诺·德·奥利维拉

37

这取决于您的操作系统和外壳

具有shell bash的linux上,您可以在控制台中创建如下这样的环境变量:

export FOO=bar

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

Ubuntu上的环境变量



2
那Windows呢?你能在这里补充吗?
YakovL

啊,没关系,好​​像在这里得到了回答:stackoverflow.com/questions/9249830/…–
YakovL

在Linux bash中,这些值是否保持不变?如果我只想仅在终端打开时运行它,以免以后再引起其他应用程序问题,该怎么办?
JesseBoyd

13

就像ctrlplusb所说的那样,我建议您使用package dotenv,但是另一种方法是创建一个js文件,并在应用程序服务器的第一行中要求它。

env.js:

process.env.VAR1="Some value"
process.env.VAR2="Another Value"

app.js:

require('env')
console.log(process.env.VAR1) // Some value

9

Windows用户:请注意!建议将这些命令用于Unix,但在Windows上它们只是临时的。它们仅为当前外壳设置一个变量,一旦您重新启动计算机或启动新的终端外壳,它们就会消失。

  • 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

步骤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


2
@JohnXiao怎么样?
布莱尔



2

作为@ctrlplusb答案的扩展,
我建议您也查看一下该env-dot-prop软件包。

它允许你设置/从获得性process.env使用dot-path

假设您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因子配置


2

下面是成功使用环境变量的一种很好的方法:

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环境变量

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

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

  1. 假设我们编写了“ setenv ” bat文件,该文件带有一个参数,即我们要设置的环境

  2. 现在运行“ setenv dev

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

希望能有所帮助。


1

使用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在您的应用程序。


0

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


-1

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

  1. 在终端运行nano〜/ .bash_profile
  2. 添加如下一行:export MY_VAR = var
  3. 保存并运行源〜/ .bash_profile
  4. 在节点中使用,例如:console.log(process.env.MY_VAR);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.