Answers:
使用环境变量(在这种情况下)将凭据传递给您的应用程序。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脚本以导出变量。
env DEBUG=* node some_file.js
dotenv
就是全部,因为它将读取您的.env
文件并应用它。
我强烈建议您查看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'文件,因此您无需担心应用程序在没有应用程序的情况下掉下来。
只需在命令行上提供环境值
USER_ID='abc' USER_KEY='def' node app.js
您可以通过进程全局变量设置环境变量,如下所示:
process.env['NODE_ENV'] = 'production';
适用于所有平台。
如果需要管理选项,请尝试使用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));
这取决于您的操作系统和外壳
在具有shell bash的linux上,您可以在控制台中创建如下这样的环境变量:
export FOO=bar
有关ubuntu上的环境变量的更多信息(例如):
就像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
Windows用户:请注意!建议将这些命令用于Unix,但在Windows上它们只是临时的。它们仅为当前外壳设置一个变量,一旦您重新启动计算机或启动新的终端外壳,它们就会消失。
SET TEST="hello world"
$env:TEST = "hello world"
要在Windows上设置持久性环境变量,您必须改为使用以下方法之一:
A)项目中的.env文件 -这是最好的方法,因为这意味着您可以将项目移至其他系统,而不必在可以运行代码的系统上设置环境变量。
.env
在项目文件夹的根目录中创建一个包含以下内容的文件:TEST="hello world"
编写一些将读取该文件的节点代码。我建议安装dotenv(npm install dotenv --save
),然后require('dotenv').config();
在节点设置代码中添加。
process.env.TEST
Env文件可以很好地保留您不想在代码库中包含的api密钥和其他秘密。只要确保将其添加到您的中即可.gitignore
。
B)使用Powershell-这将创建一个可以在其他终端中访问的变量。但是请注意,重新启动计算机后,该变量将丢失。
[Environment]::SetEnvironmentVariable("TEST", "hello world", "User")
在Windows论坛上广泛建议使用此方法,但是我认为人们并不知道该变量在系统重新启动后不会持续存在。
C)使用Windows GUI
步骤1:将环境变量添加到其相应文件中。例如,您的登台环境可以称为.env.staging
,其中包含特定于您的登台环境的环境变量USER_ID
和USER_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
对于Windows用户,此Stack Overflow问题和最佳答案对于如何通过命令行设置环境变量非常有用。
遇到了一个很好的工具来做到这一点。
将环境文件(包含ENV变量导出)解析并加载到Node.js环境中,即process.env
-使用以下样式:
.env
# some env variables
FOO=foo1
BAR=bar1
BAZ=1
QUX=
# QUUX=
作为@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因子配置。
下面是成功使用环境变量的一种很好的方法:
A. 有不同的配置文件:
dev.js //仅
包含所有环境变量以供开发该文件包含:
module.exports = {
ENV: 'dev',
someEnvKey1 : 'some DEV Value1',
someEnvKey2 : 'some DEV Value2'
};
stage.js //仅包含所有环境变量以供开发
..
qa.js //仅
包含所有环境变量以进行qa测试该文件包含:
module.exports = {
ENV: 'dev',
someEnvKey1 : 'some QA Value1',
someEnvKey2 : 'some QA Value2'
};
注意:这些值主要随环境而变化,但是键保持不变。
你可以有更多
z__prod.js // //所有环境变量仅用于生产环境/实时环境
注意:永远不会捆绑此文件以进行部署
将所有这些配置文件放在/ 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(或其他操作系统)中编写自动化
假设我们编写了“ setenv ” bat文件,该文件带有一个参数,即我们要设置的环境
现在运行“ 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一)。
希望能有所帮助。
使用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_1
,process.env.ENV_VAR_2
,process.env.ENV_VAR_3
在您的应用程序。
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