我正在尝试遵循教程,它说:
有几种方法可以加载凭据。从环境变量加载,从磁盘上的 JSON 文件加载,密钥需要如下:USER_ID,USER_KEY ...这意味着如果您正确设置了环境变量,则根本不需要在应用程序中管理凭据.
根据一些谷歌搜索,看来我需要在 process.env
中设置变量?如何以及在哪里设置这些凭据?请举例。
环境变量(在这种情况下)用于将凭据传递给您的应用程序。 USER_ID
和 USER_KEY
都可以分别从 process.env.USER_ID
和 process.env.USER_KEY
访问。您无需编辑它们,只需访问它们的内容。
看起来他们只是让您选择从 process.env
或磁盘上的某个特定文件加载 USER_ID
和 USER_KEY
。
现在,当您运行应用程序时,奇迹发生了。
USER_ID=239482 USER_KEY=foobar node app.js
这会将用户 ID 239482
和用户密钥作为 foobar
传递。这适用于测试,但是对于生产,您可能需要配置一些 bash 脚本来导出变量。
我强烈建议查看 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' 文件不是必需的,因此您不必担心您的应用程序在它不存在时会摔倒。
您可以通过进程全局变量设置环境变量,如下所示:
process.env['NODE_ENV'] = 'production';
适用于所有平台。
只需在命令行上提供环境值
USER_ID='abc' USER_KEY='def' node app.js
如果您想要管理选项,请尝试使用 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));
这取决于您的操作系统和外壳
在带有 shell bash 的 linux 上,您可以创建这样的环境变量(在控制台中):
export FOO=bar
有关 ubuntu 环境变量的更多信息(例如):
Environment variables on ubuntu
npm install --save geo-ip
,它需要环境键 = 值设置才能进行安装。
就像 ctrlplusb 说的,我建议你使用包 dotenv
,但另一种方法是创建一个 js 文件并在应用服务器的第一行需要它。
环境.js:
process.env.VAR1="foo"
process.env.VAR2="bar"
应用程序.js:
require('./env') // env.js relative path.
console.log(process.env.VAR1) // foo
require('./env')
Windows用户:注意!这些命令推荐用于 Unix,但在 Windows 上它们只是临时的。他们只为当前的 shell 设置一个变量,一旦你重新启动你的机器或启动一个新的终端 shell,它们就会消失。
设置测试="你好世界"
$env:TEST = "你好世界"
要在 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 问题和最佳答案对于如何通过命令行设置环境变量非常有用
How can i set NODE_ENV=production in Windows?
遇到了一个很好的工具来做到这一点。
将环境文件(包含 ENV 变量导出)解析并加载到 Node.js 环境中,即 process.env
- 使用此样式:
.env
# some env variables
FOO=foo1
BAR=bar1
BAZ=1
QUX=
# QUUX=
使用 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_1
、process.env.ENV_VAR_2
、process.env.ENV_VAR_3
。
如果您使用的是 mac/linux,并且您想检索您正在使用的机器的本地参数,您将执行以下操作:
在终端运行 nano ~/.bash_profile 添加一行:export MY_VAR=var save & run source ~/.bash_profile in node use like:console.log(process.env.MY_VAR);
作为@ctrlplusb 答案的扩展,
我建议您也看看 env-dot-prop
包。
它允许您使用 dot-path
从 process.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。
我成功使用的一个很好的环境变量方法如下:
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 : '一些 QA Value2' };
注意:这些值主要随环境而变化,但键保持不变。
你可以有更多的 z__prod.js // 这有所有的环境变量只用于生产/实时 注意:这个文件永远不会捆绑部署将所有这些配置文件放在 /config/ 文件夹
注意: prod 的名称与其他名称不同,因为它不会被所有人使用。
B. 从配置文件中设置 OS/ Lambda/ AzureFunction/ GoogleCloudFunction 环境变量
现在理想情况下,文件中的这些配置变量应该作为操作系统环境变量(或者,LAMBDA 函数变量,或者,Azure 函数变量,谷歌云函数等)
所以,我们在 Windows 操作系统(或其他)中编写自动化
假设我们编写'setenv' bat 文件,它接受一个参数,即我们要设置的环境现在运行“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)。
希望有帮助。
设置系统环境变量后,我变得不确定。当我将 APP_VERSION 放入 User env var 时,我可以通过 process.env.APP_VERSION 显示来自节点的值
如果您使用 Visual Studio 代码调试功能,您可以添加 "envFile": "${workspaceRoot}/.env"
来启动配置。这样你就不必使用 dotenv。
{
"cwd": "${workspaceRoot}",
"command": "npm start",
"name": "Run be",
"request": "launch",
"type": "node-terminal",
"envFile": "${workspaceRoot}/.env"
},
与其他一些答案非常相似,但没有任何库或(bash)export
。
我有一些加密变量,然后我需要动态生成它们。
魔术发生在 set -a && ... && set +a
上,它可以是一些内容或文件。
#!/bin/sh
set -a
SOMEVAR_A="abcd"
SOMEVAR_B="efgh"
SOMEVAR_C=123456
set +a
# or
set -a && . ./file && set +a
我有一个 docker-entrypoint.sh
:
#!/bin/sh
node app/config/set-environment.js
ENVFILE=/tmp/.env
if [[ ! -f "$ENVFILE" ]] ; then
echo "File $ENVFILE is not there, aborting."
exit
fi
# here is where things happen
set -a && . $ENVFILE && set +a
if [ "${NODE_ENV}" = "development" ]; then
npx nodemon app/server.js
else
node app/server.js
fi
exec "$@"
而 set-environment.js
生成 (tmp) .env
文件
使用跨环境。它将为您省去很多麻烦
npm i -S cross-env
cross-env PARAM=value node ./index.js
这通常对非凭据有好处。对于凭据和密钥之类的东西,最好不要存储硬编码的用户 ID 和密码,而是使用不在 repo 和 dotenv
中的 .env
文件
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-envenv DEBUG=* node some_file.js
dotenv
的全部内容,因为它会读取您的.env
文件并应用它。