在Node.js中读取环境变量

1542

在Node.js代码中,有没有一种方法可以读取环境变量?

例如Python中的os.environ['HOME']

10个回答

2161

5
请注意,这将不会在节点进程及其子进程之外显示。例如,当节点进程正在运行时,在另一个 shell 窗口中触发 env 不会显示它,在节点进程退出后,在同一 shell 中也不会显示它。 - Marko Bonaci
28
这也适用于变量的赋值。process.env.FOO = "foo"; 是可行的。 - chicks
41
值得一提的是,这种方法在React应用程序中无效。由于安全原因,process.env被清理过滤掉了。只有以 REACT_ENV_ 开头的变量才可用。请参阅:https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-custom-environment-variables。 - Mark Edington
15
@MarkEdington 我认为应该是 REACT_APP_ - Mr. 14
9
没错,你说得对!应该用REACT_APP_而不是REACT_ENV_。 - Mark Edington
显示剩余4条评论

171

在使用Node.js时,您可以通过键从process.env对象检索环境变量:

例如:

var mode   = process.env.NODE_ENV;
var apiKey = process.env.apiKey; // '42348901293989849243'

以下是解释如何在 node.js 中设置环境变量的答案:setting environment variables in node.js


1
以上的 process.env 方法需要使用哪个库? - user_mda
5
process.env 是内置在 Node.js API 中的。 - Jason Axelson
我是否只需在process.env上设置我想要的内容?为什么人们将其设置在那里,而不是像被node.js require()的配置对象中? - PDN
4
process.env 可以让你访问操作系统级别设置的环境变量。这些变量可以通过不同的方式设置,具体取决于应用程序的部署位置。例如,我通常会使用 NODE_ENV=development NODE_PATH=lib node server.js 来运行本地应用程序。然后,process.env.NODE_PATH 将返回 'lib'。 - Russell Ormes

73

如果您想在Node.JS中检索环境变量,可以使用process.env.VARIABLE_NAME,但不要忘记,将属性赋值给process.env将隐式地将该值转换为字符串。

避免布尔逻辑

即使您的.env文件定义了一个变量,例如SHOULD_SEND=falseSHOULD_SEND=0,这些值也会被转换为字符串(分别为“false”和“0”),而不是解释为布尔值。

if (process.env.SHOULD_SEND) {
 mailer.send();
} else {
  console.log("this won't be reached with values like false and 0");
}

相反,你应该进行明确的检查。我发现依赖于环境名称是很有用的。

 db.connect({
  debug: process.env.NODE_ENV === 'development'
 });

6
我喜欢在需要显式检查的布尔环境变量中使用“是”和“否”。这可以避免许多编程语言中的问题。 - Dogweather
我喜欢能够只需说出THIS_FEATURE=0 THAT_FEATURE=1 MAIL_TO='me@example.org' ./myapp - undefined

68
如果你想在Node.js程序中使用一个字符串键,比如 var v = 'HOME',你可以使用process.env[v]。否则,在你的程序中必须硬编码process.env.VARNAME

1
为什么你有 process.env['HOME'] - AlgoRythm

53

您可以使用dotenv包来管理每个项目的环境变量:

  • 在项目目录下创建一个.env文件,并将所有变量作为VAR_NAME=value对放入其中。
  • 在应用程序入口文件顶部添加require('dotenv').config();

现在,您可以使用process.env.VAR_NAME访问您的环境变量。


17
dotenv包很有用,但问题的答案可以通过读取process.env.ENV_VARIABLE来获得。dovenv包的作用在于将设置从文件加载到环境变量中。 - Robert Patterson
1
这就是我的观点:使用env库来管理和加载环境变量。 - Huy Vo
1
您可以使用 envdir 工具以非特定于 Node.js 的方式执行相同的操作。 - Chris Johnson
类似于 https://github.com/bitrise-io/envman,它也不是“node”特定的。 - MarkHu
2
这应该是答案。我一直在尝试使用 process.env.MY_VAR,但直到我加上了 require 语句才起作用。谢谢! - juliangonzalez

14

使用 process.env。 如果 Home 是您的环境变量名称,请尝试以下操作:

const HOME = process.env.HOME;

或者

const { HOME } = process.env;

6
如果您想在执行时查看所有环境变量,只需在一些Node.js文件中编写,例如server.js: console.log(process.env);

0

#安装npm包dotenv

npm i dotenv

#让我们创建一个名为.env的文件

#在.env文件中,我要做的是...

DATABASE_CONFIG={"host":"localhost","user":"root","password":"password123"}

BASE_URL=192.168.163.128;

#现在我们将创建index.js文件,其中包含以下方式...

require('dotenv').config();

// 示例 - 01: const url = process.env.BASE_URL; console.log("从环境中读取的基本URL:" + url);

// 示例 - 02:

const databaseConfigString = process.env.DATABASE_CONFIG; console.log(databaseConfigString);

let databaseConfig;

try { databaseConfig = JSON.parse(databaseConfigString); } catch (error) { console.error('解析DATABASE_CONFIG时出错:', error.message); }

if (databaseConfig) { console.log('数据库配置:', databaseConfig); console.log('主机:', databaseConfig.host); console.log('用户:', databaseConfig.user); console.log('密码:', databaseConfig.password); }

https://www.youtube.com/watch?v=gzCZ7l4pK3Y


0

首先,您需要安装以下库,确保您在项目的根目录中:

npm i dotenv

下一步,创建一个 .env 文件,确保它位于项目目录的根目录下。以下是在其中添加新变量的示例:
# test variable
TESTVARIABLE='The test variable is working, value pulled from local!'

下一步,您需要在您希望使用环境变量的文件中引用这个模块/库。例如,在index.js文件的顶部添加以下代码:
require("dotenv").config();

现在你可以像这样使用/获取环境变量:
const message = process.env['TESTVARIABLE'];

-8
为什么不在用户目录的.bash_profile文件中使用它们,这样你就不必将任何带有变量的文件推送到生产环境中了?

1
原因是,如果您使用.bash_profile,那么它将为该用户的环境设置它,但如果您在那里运行多个实例,则必须为其设置多个环境变量,而不是只有一个。例如,如果您设置了PORT变量,则必须将其设置为PORT_1等,但如果您通过.env使用它,则可以使用具有不同PORT号码的.env文件的相同代码。 - Raheel Shahzad
我不明白在 .bash_profile 中设置变量与 .env 有什么不同。当应用程序托管在 Linux 服务器上时,在 .bash_profile 中设置相同的变量比在 .env 文件中设置更安全。您仍然可以根据条件在 bash_profile 中使用不同的端口号,这也更加安全。 - Brad Vanderbush

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