为Node设置环境变量以检索

543

我试图跟随一个教程,它说:

有几种加载凭据的方法。

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

键需要如下设置:

USER_ID, USER_KEY

这意味着,如果您正确设置了环境变量,您就无需在应用程序中管理凭据。

20个回答

477

在这种情况下,环境变量被用于将凭证传递给您的应用程序。可以分别从process.env.USER_IDprocess.env.USER_KEY 访问USER_IDUSER_KEY 。您无需编辑它们,只需访问其内容。

看起来他们只是在让你选择从process.env或磁盘上指定的文件中加载USER_IDUSER_KEY

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

USER_ID=239482 USER_KEY=foobar node app.js

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


33
如果你使用的是 fish 而不是 bash,则需要使用以下命令:env USER_ID=239482 my_command。例如,要为node.js的 debug 库设置环境变量,请使用以下命令:env DEBUG='*' node some_file.js。参考链接:http://fishshell.com/docs/current/faq.html#faq-single-env。 - SilentSteel
1
我发现我必须删除“*”周围的引号才能使其正常工作:env DEBUG=* node some_file.js - divillysausages
@SamT,如何在Ubuntu Linux中设置这些变量? - Zameer Ansari
1
有没有可能添加一个文件,而不是添加大量的环境脚本?还是UNIX用户需要创建一个Bash脚本? - mibbit
@mibbit 是的,这就是 dotenv 的作用,它会读取你的 .env 文件并应用它。 - balexandre

238

我强烈推荐使用dotenv包。

https://github.com/motdotla/dotenv

它有点类似于@Benxamin所建议的库,但更加简洁,不需要任何bash脚本。另外值得一提的是,该代码库非常流行且维护良好。

基本上你需要一个.env文件(我强烈建议从你的git/mercurial等版本控制中忽略它):

FOO=bar
BAZ=bob

然后在你的应用程序入口文件中,尽早添加以下行:

require('dotenv').config();

完成。'process.env'现在将包含上述变量:

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

“.env”文件不是必需的,因此您无需担心应用程序在其缺失时崩溃。


2
虽然如果您提供了应用程序所需的相关配置细节(例如此问题所询问的内容),那么在缺少这些细节时,它很可能会出现故障... 但它仍然似乎是一个不错的选择。 - John
7
如果您正在寻找额外的安全性,那么https://github.com/rolodato/dotenv-safe和一些测试应该可以做到。 - ctrlplusb
1
如果您不想在应用程序中要求它,请查看以下链接:https://github.com/direnv/direnv - AlecRust
这意味着将您的机密提交到Git存储库中。 - zookastos
1
我不建议这样做。这应该只针对您的本地环境,并且文件应该被添加到.gitignore中。CI/CD应该为其他环境注入环境变量。 - ctrlplusb
如果有人遇到麻烦,请确保你的文件名为“.env”。这是dotenv默认搜索的路径。 - blz

170

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

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

适用于所有平台。


45
环境变量旨在从代码外部设置,而不是内部设置——所以这样做反其道而行之,是一个糟糕的例子。 - Soren
78
@Soren我们的节点程序启动子进程从这个答案中受益,因此尽管有点非传统,但仍存在使用情况。 - pspi
2
@pspi -- 我99%确定你做错了,除非你是像这样配置包的作者,否则你应该使用这样的配置包。 - Soren
35
如果你正在使用npm运行js构建脚本,这将非常有用。 - Stephen Drew
56
这也适用于例如在运行测试时设置和覆盖环境变量的情况。 - mtkopone
显示剩余8条评论

128

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

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

2
只是补充一下,我在 Windows 上使用 bash shell(cygwin;我想是与 git 工具一起安装的)时它可以正常工作。 - markau
@TiborSzasz:Cygwin或Powershell应该可以解决这个问题。当然,这是两年后提到的。 - orlando marinella
15
针对Windows用户:设置USER_ID为'abc'。 - Mike
1
@Mike,你应该把它变成一个正式的答案 :) - rocketspacer
6
我们可以使用 cross-env 包(https://www.npmjs.com/package/cross-env)来使它在 Unix 或 Windows 上运行。 - Brij

64
如果您想要管理选项,可以尝试使用< strong> envs npm软件包。如果设置了环境变量,则它会返回环境值。否则,如果在环境中不存在,您可以指定存储在全局< strong> defaults 对象变量中的默认值。
使用< strong> .env 或环境文件是有好处的。个人可以管理自己的配置。您可以将不同环境(dev、stage、prod)部署到具有自己环境设置的云服务上。您还可以设置合理的默认值。
在您的< code>.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));

2
嗯,我尝试使用这个包,但它似乎只跟踪环境变量的使用。它不读取 .env 文件(https://www.npmjs.com/package/envs)。这是正确的包吗? - wawka
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Benxamin
1
"require('envs')"? "envs" 是什么? - CodyBugstein
1
'envs' 是一个 Node.js 模块的名称:https://www.npmjs.com/package/envs - Benxamin
7
我推荐使用 "dotenv" 模块,它会将所有的环境变量放入进程对象中,非常方便。顺便说一下,这个模块很不错。 - Bruno de Oliveira
显示剩余2条评论

47

这取决于您的操作系统和 shell。

在带有 bash shell 的 Linux 上,您可以通过以下方式创建环境变量(在控制台中):

export FOO=bar

了解 Ubuntu 上的环境变量(例如)的更多信息,请访问以下链接:Ubuntu 上的环境变量


1
然后请看这个答案:https://dev59.com/3nVC5IYBdhLWcg3w9GHM - leszek.hanusz
2
那Windows呢?你能加上吗? - YakovL
啊,没事了,看起来这里已经有答案了:https://dev59.com/rGox5IYBdhLWcg3wWzN7 - YakovL
在Linux的bash中,这些值是否会被持久化?如果我只想在终端打开时运行它,以免后来与其他应用程序发生冲突,该怎么办? - JesseBoyd
这对我的需求非常完美 - 对于我的 npm install --save geo-ip,需要一个环境 key=value 设置才能使安装工作。 - Scott Fleming
关于 Mac 呢?我使用 shelljs 创建了一个子进程。 - Charles-Lévi BRIANI

33

警告:Windows 用户请注意!这些命令是针对 Unix 推荐的。但在 Windows 上,它们不会持久化,它们只会在当前 shell 中设置一个变量,并且在重新启动后就会消失。

  • SET TEST="hello world"
  • $env:TEST = "hello world"

在 Windows 上设置持久性环境变量的三种方法:

A) 项目中的 .env 文件 - 最佳方法。因为你只需将该文件复制到任何计算机上,在运行项目时即可获得相同的配置。

  1. 在项目文件夹根目录中创建一个 .env 文件,其内容为:TEST="hello world"

  2. 编写一些读取该文件的 Node 代码。建议安装 dotenv(npm install dotenv --save),然后在 Node 设置代码中添加 require('dotenv').config();

  3. 现在可以在 Node 中使用 process.env.TEST

Env 文件是将 API 密钥保留在代码库之外的好方法

B) 使用 PowerShell - 这将创建一个在其他终端中可访问的变量。但它很糟糕,因为它将在重新启动计算机后丢失。

[Environment]::SetEnvironmentVariable("TEST", "hello world", "User")

这种方法在 Windows 论坛中被广泛推荐,但人们似乎不知道它在系统重启后不会保留……

C) 使用 Windows GUI

在开始菜单搜索或控制面板中搜索“环境变量”,选择“编辑系统环境变量”。会打开一个对话框,您需要在对话框底部单击“环境变量”按钮,以打开一个编辑视图,在其中您可以单击“新建”按钮以添加新的环境变量。很容易操作。即使重启后也会保持不变。但这并不是您应该用来配置特定代码库的东西。

24

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

env.js:

process.env.VAR1="foo"
process.env.VAR2="bar"

应用程序的js文件:

require('./env') // env.js relative path.
console.log(process.env.VAR1) // foo

我收到了一个错误,错误信息为:无法找到模块“env”。 - canbax
请使用 require('./env') - canbax

12

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


1
不支持 Windows。 - jlguenego
1
@jlguenego 我同意,永远不要在 Node 的生产服务器上使用 Windows。 - Blairg23

7

使用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_1process.env.ENV_VAR_2process.env.ENV_VAR_3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接