为节点设置环境变量以检索
Posted
技术标签:
【中文标题】为节点设置环境变量以检索【英文标题】:Setting Environment Variables for Node to retrieve 【发布时间】:2014-04-14 07:03:50 【问题描述】:我正在尝试遵循一个教程,它说:
有几种方法可以加载凭据。
从环境变量加载, 从磁盘上的 JSON 文件加载,
键需要如下:
USER_ID, USER_KEY
...这意味着如果您正确设置了环境变量,您 根本不需要在您的应用程序中管理凭据。
根据一些谷歌搜索,看来我需要在process.env
中设置变量?如何以及在哪里设置这些凭据?请举例。
【问题讨论】:
【参考方案1】:环境变量(在这种情况下)用于将凭据传递给您的应用程序。 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 脚本来导出变量。
【讨论】:
如果你使用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
我发现我必须删除 "*" 周围的引号才能正常工作:env DEBUG=* node some_file.js
@SamT 如何在 Ubuntu linux 中设置这些变量?
是否可以添加文件而不是添加大量 env 脚本或 unix 用户需要创建 bash 脚本?
@mibbit 是的,这就是dotenv
的全部意义所在,因为它会读取您的.env
文件并应用它。【参考方案2】:
我强烈建议查看 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' 文件不是必需的,因此您无需担心您的应用在缺少它时会摔倒。
【讨论】:
尽管如果您确实放置了您的应用程序需要的相关配置详细信息(例如这个问题正在询问),那么它可能会在没有它的情况下崩溃.. 但它似乎仍然是一个不错的选择. 如果您正在寻找额外的安全性,那么 github.com/rolodato/dotenv-safe 和一些测试应该可以做到。 如果您不想在应用程序中要求它:github.com/direnv/direnv 这意味着在 git repo 中提交你的秘密 我不建议这样做。这应该仅适用于您的本地环境,并且文件应该是 gitignore'd。 CI/CD 应该为其他环境注入环境变量。【参考方案3】:可以通过进程全局变量设置环境变量,如下:
process.env['NODE_ENV'] = 'production';
适用于所有平台。
【讨论】:
... 环境变量旨在从代码外部设置,而不是在内部设置 - 所以这违背了目的并且是一个坏例子 @Soren 我们启动子进程的节点程序受益于这个答案,所以即使它有点不正统,也有一些用例 @pspi -- 我 99% 确定 你做错了 除非你是 config package 的作者,比如 this,否则你应该使用这样的而是配置包。 如果您在 js 中编写构建脚本并从 npm 运行它们,这将非常有用 这对于例如在运行测试时设置和覆盖环境。【参考方案4】:只需在命令行上提供环境值
USER_ID='abc' USER_KEY='def' node app.js
【讨论】:
只是补充一点,它在带有 bash shell(cygwin;我认为安装了 git 工具)的 Windows 上对我有用。 @TiborSzasz:Cygwin 或 Powershell 应该可以解决这个问题。当然,这是两年后提到的。 对于 Windows 使用:SET USER_ID='abc' @Mike,你应该做出正确的回答:) 我们可以使用跨环境包(npmjs.com/package/cross-env)使其在unix或windwos上工作【参考方案5】:如果您需要管理选项,请尝试 envs npm 包。如果已设置,它将返回环境值。否则,您可以指定存储在全局 defaults 对象变量中的默认值(如果它不在您的环境中)。
使用 .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));
【讨论】:
嗯,我尝试使用这个包,但它似乎只跟踪环境变量的使用。它不读取 .env 文件 (npmjs.com/package/envs)。它是一个正确的包吗? 你是对的!它不读取 .env 文件。这很尴尬。我忘记了我正在使用@SamT提到的bash脚本加载.env,所以它仍然有效。 "需要('envs')"?什么是“环境”? 'envs' 是节点模块的名称:npmjs.com/package/envs 另外我推荐使用“dotenv”模块,它把所有的 ENV 变量都放到了 proccess 对象中,顺便说一下很整洁。【参考方案6】:这取决于你的操作系统和你的 shell
在带有 shell bash 的 linux 上,您可以像这样(在控制台中)创建环境变量:
export FOO=bar
更多关于 ubuntu 环境变量的信息(例如):
Environment variables on ubuntu
【讨论】:
然后看到这个答案:***.com/questions/135688/… 那么 Windows 呢?你能在这里补充一下吗? 啊,没关系,好像在这里回答了:***.com/questions/9249830/… 在 Linux bash 中这些值是否保持不变?如果我只想在终端打开时运行它,以便以后不会导致其他应用程序出现问题,该怎么办? 这非常适合我的需要 - 我的npm install --save geo-ip
需要环境键=值设置才能安装。【参考方案7】:
Windows 用户:注意!这些命令推荐用于 Unix,但在 Windows 上它们只是临时的。他们只为当前的 shell 设置一个变量,一旦你重启你的机器或启动一个新的终端 shell,它们就会消失。
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
-
在开始菜单搜索或控制面板中搜索“环境变量”
选择“编辑系统环境变量”
将打开一个对话框。点击对话框底部的“环境变量”按钮。
现在您有了一个用于编辑变量的小窗口。只需单击“新建”按钮即可添加新的环境变量。简单。
【讨论】:
【参考方案8】:就像 ctrlplusb 说的,我建议你使用包dotenv
,但另一种方法是创建一个 js 文件并在应用服务器的第一行要求它。
env.js:
process.env.VAR1="foo"
process.env.VAR2="bar"
app.js:
require('./env') // env.js relative path.
console.log(process.env.VAR1) // foo
【讨论】:
我收到错误消息 Error: Cannot find module 'env' 应该是require('./env')
【参考方案9】:
第 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
【讨论】:
@JohnXiao 怎么样?【参考方案10】:对于 Windows 用户来说,这个 Stack Overflow 问题和最佳答案对于如何通过命令行设置环境变量非常有用
How can i set NODE_ENV=production in Windows?
【讨论】:
【参考方案11】:遇到了一个很好的工具。
node-env-file
将环境文件(包含 ENV 变量导出)解析并加载到 Node.js 环境中,即process.env
- 使用这种样式:
.env
# some env variables
FOO=foo1
BAR=bar1
BAZ=1
QUX=
# QUUX=
【讨论】:
【参考方案12】: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
。
【讨论】:
【参考方案13】:作为@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。
【讨论】:
【参考方案14】:我已经成功使用过的一个很好的环境变量处理方法如下:
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 环境变量
现在理想情况下,文件中的这些配置变量应该作为操作系统环境变量(或者,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)。
希望对您有所帮助。
【讨论】:
【参考方案15】:如果您使用的是 mac/linux,并且您想将本地参数检索到您正在使用的机器上,您可以这样做:
-
在终端运行 nano ~/.bash_profile
添加如下一行:export MY_VAR=var
保存并运行 source ~/.bash_profile
在节点中使用如下:console.log(process.env.MY_VAR);
【讨论】:
这正是我想要的。谢谢【参考方案16】:设置系统环境变量后,我变得不确定。当我将 APP_VERSION 放入 User env var 中时,我可以通过 process.env.APP_VERSION 显示来自节点的值
【讨论】:
【参考方案17】:如果您使用 Visual Studio 代码调试功能,您可以添加 "envFile": "$workspaceRoot/.env"
来启动配置。这样你就不必使用 dotenv。
"cwd": "$workspaceRoot",
"command": "npm start",
"name": "Run be",
"request": "launch",
"type": "node-terminal",
"envFile": "$workspaceRoot/.env"
,
【讨论】:
【参考方案18】:使用跨环境。它会为您省去很多麻烦
npm i -S cross-env
cross-env PARAM=value node ./index.js
这通常对非凭据有好处。对于凭据和密钥之类的东西
最好不要存储硬编码的用户 ID 和密码,而是使用不在 repo 中的 .env
文件和 dotenv
【讨论】:
以上是关于为节点设置环境变量以检索的主要内容,如果未能解决你的问题,请参考以下文章