Node.js:设置环境variables

我试图按照教程,它说:

“有几种方法来加载凭据。

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

钥匙需要如下:

USER_ID, USER_KEY 

…这意味着如果你正确地设置你的环境variables,你根本不需要在应用程序中pipe理凭据。

基于一些谷歌search,似乎我需要在process.env设置variables? 我如何以及在哪里设置这些凭据? 示例请。

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

看起来他们只是简单的给你加载你的USER_IDUSER_KEY之间的select从任何process.env或磁盘上的一些特定的文件。

现在,当你运行应用程序的时候,魔法就会发生。

USER_ID=239482 USER_KEY=foobar node app.js

这将传递用户ID 239482和用户键作为foobar 。 这适用于testing,但是对于生产,您可能会configuration一些bash脚本来导出variables。

我强烈build议查看dotenv软件包。

https://github.com/motdotla/dotenv

这是类似于@Benxamin答案中提到的图书馆,但它更清洁,不需要任何bash脚本。 另外值得注意的是,代码库很受欢迎,维护得很好。

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

 FOO=bar BAZ=bob 

然后在您的应用程序条目文件中尽可能早地放入以下行:

 require('dotenv').config(); 

繁荣。 完成。 'process.env'现在将包含上面的variables:

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

'.env'文件不是必需的,所以你不必担心你的应用程序在不在的情况下崩溃。

只需在命令行上提供env值即可

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

如果您想要pipe理选项,请尝试使用envs npm软件包。 如果设置了它,则返回环境值。 否则,您可以指定存储在全局默认对象variables中的缺省值(如果它不在您的环境中)。

使用.env (“dot ee-en-vee”)或环境文件是有好处的,原因很多。 个人可以pipe理自己的configuration。 您可以使用自己的环境设置将不同的环境(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文件中的variables存入您的环境中,您可以在启动应用程序之前使用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)); 

您可以通过stream程全局variables来设置环境variables,如下所示:

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

适用于所有平台。

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

在使用shell bash的linux上,你可以像这样创build环境variables(在控制台中):

 export FOO=bar 

有关ubuntu环境variables的更多信息(例如):

Ubuntu上的环境variables

对于Windows用户这个堆栈溢出问题和顶部的答案是非常有用的如何通过命令行设置环境variables

我怎样才能在Windows中设置NODE_ENV =生产?

碰到一个很好的工具来做到这一点。

节点ENV文件

将环境文件(包含ENVvariables导出)parsing并加载到Node.js环境中,即process.env – 使用此样式:

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

Windows重要:有多种方式来设置环境variables。 但是他们中的大多数都不是持续的,对于目前的壳来说是暂时的。 (如SET SWEDISH_CHEF="bork bork"$env:SWEDISH_CHEF = "bork bork"

为了使它坚持使用这个Poweshell命令: [Environment]::SetEnvironmentVariable("SWEDISH_CHEF", "bork bork", "User")注意:第三个参数“User”指定级别(也可以是“Process”或“机器”,但从我发现“用户”实际上是用于process.env

validation它是否持续:启动一个新的terminal,运行node并在节点shell中inputprocess.env.SWEDISH_CHEF以打印值。

编辑:env var似乎没有坚持后重新启动。 所以我最终通过我的电脑下的GUI来设置它,使其永远持续下去

第1步:将您的环境variables添加到适当的文件。 例如,您的临时环境可以被称为.env.staging ,其中包含特定于临时环境的环境variablesUSER_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

下面是成功使用环境variables的一个很好的方法:

A. 有不同的configuration文件

  1. dev.js //这里只有开发环境variables
    该文件包含:

     module.exports = { ENV: 'dev', someEnvKey1 : 'some DEV Value1', someEnvKey2 : 'some DEV Value2' }; 
  2. stage.js //这个只有开发环境variables

     .. 
  3. qa.js //这里只有qatesting的所有环境variables
    该文件包含:

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

:值大多随环境而变化,但密钥保持不变。

  1. 你可以有更多

  2. z__prod.js //这里只有生产/生活的所有环境variables
    注意:此文件从不捆绑用于部署

  3. 把所有这些configuration文件放在/ 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. 从configuration文件中设置OS / Lambda / AzureFunction / GoogleCloudFunction环境variables

现在理想的情况是,这些configurationvariables在文件中,应该作为OS环境variables(或LAMBDA函数variables,或者Azure函数variables,Google Cloud Functions等)

所以,我们在Windows操作系统(或其他)

  1. 假设我们写' setenv'bat文件,它带有一个我们想设置的环境参数

  2. 现在运行“ setenv dev

a)这会从传入的参数variables(现在为'dev')input,
b)读取相应的文件('config \ dev.js')
c)在Windows操作系统(或其他)中设置环境variables

例如,

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环境variables都可以从qa.js中使用,并且可以被同一个程序使用(它总是要求process.env.someEnvKey1,但是它的值是qa)。

希望有所帮助。

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

由于@ctrlplusb的扩展回答,
我build议你也看看env-dot-prop软件包。

它允许您使用dot-path来设置/从process.env获取属性。

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

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

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

 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'} 

这有助于您parsing环境variables,并将其用作应用程序中的configuration对象。
它还可以帮助您实施12因子configuration 。