原文链接:Easiest Way to Set & Use Environment Variables (.env) in Node.js,2023.02.19,by Robin
Node.js 中的环境变量用于安全地存储应用程序的敏感信息。因此,掌握如何正确地设置和使用环境变量对每个开发人员来说都是很重要的一项技能。
大多数情况下,新手开发会将一些重要信息写在源代码中,比如数据库凭据、API 密钥等,这是一种很危险的做法。大家可能会在使用环境变量时感觉很困难,这也是新手开发不愿意使用的原因,但使用起来其实并没有你想得这么难。
本文会以轻松的方式、一步一步引导大家学习如何在 Node.js 应用程序中设置和使用环境变量。学完本文后,你对环境变量将会有一个清晰的认识,环境变量相关问题也会迎刃而解。
但在开始之前,你需要满足以下前提:
- 电脑上安装了 Node.js 12+ 的环境
- 能访问
npm
或yarn
的包管理软件 - 对 JavaScript 有基本了解,并知道如何使用 Node.js 创建一个服务器
为了方便大家理解,我会试着详细地解释一切。好了,先不说这个,让我们开始吧。
什么是环境变量?
环境变量是在程序外部设置的值,它们直接影响计算机中运行进程的行为方式。环境变量由操作系统管理和存储,以便任何程序都可以访问。
环境变量由键值对格式组成。这表示要设置一个环境变量,你必须定义一个键,并给它赋一个值。我们通过使用键来获取值。
为什么要使用环境变量?
环境变量允许设置不同环境(如开发或生产)的流程中使用的值。它还提供了一种安全的方式来存储敏感数据,而不是将这些信息直接放在源代码中。
例如,通过设置环境变量,可以为程序的不同实例使用不同的数据库或帐户。在开发过程中,你的程序可能使用测试数据库,但在生产环境中,使用的是生产数据库(main database)。
使用环境变量也更加安全,因为敏感数据将存储在操作系统环境中,而不是代码中。因此,即使任何人访问了你的源代码,他们也不会拥有这些数据。
创建 Node.js 项目
要创建 Node.js 项目,首先需要创建一个 packeage.json
文件。你可以使用以下命令生成 package.json
文件。
bash
$ npm init --yes
在你想要创建 Node.js 项目的目录中打开终端窗口。在终端中运行上述命令,它将在该目录中生成一个具有默认配置设置的 package.json
文件。
bash
$ npm install express
你可以为应用程序安装必要的软件包。在这个项目中,我安装了 express
依赖包。
bash
$ npm install --save-dev nodemon
我也安装了 nodemon
作为开发依赖。当我们更新代码时,它会自动重新启动我们的服务器。
现在在该目录中创建 app.js
文件。这将是你应用程序的入口。在 app.js
文件中添加以下代码以创建基本的 Node.js 服务器。
javascript
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Node.js is working!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
如果想在项目中使用 TypeScript,你可以参考《Best Node.js and Express Server Setup With TypeScript》一文。
如何在 Node.js 中使用命令行设置环境变量
你可以直接使用命令行设置环境变量。不过不同操作系统设置环境的方式有一些差异。
如果你使用的是 Windows,你必须在运行 Node.js 应用程序时使用 SET
命令来设置环境变量。
bash
// windows
SET PORT=8000 && nodemon app.js
上面的命令将设置一个 PORT
环境变量并运行服务器。现在可以在应用程序中访问这个变量。
如果需要设置多个变量,则必须使用以下命令。
bash
// windows
SET PORT=8000 && SET NODE_ENV=development && nodemon app.js
这将设置 PORT
和 NODE_ENV
环境变量。 PORT
和 NODE_ENV
的值将分别为 8000
和 development
。
但是如果你使用的是 Linux 或 MacOS,那么设置环境变量就很简单了。
bash
// Linux or MacOS
PORT=8000 nodemon app.js
像上面这样,在运行 Node.js 脚本前指定环境变量就可以了。
如何在 Node.js 中访问环境变量
所有的环境变量作为 process.env
这个象的属性存在。你可以像访问 JavaScript 对象一样从 process.env
访问环境变量。
javascript
const PORT = process.env.PORT;
console.log(typeof PORT);
// string
主要的区别是这个对象的属性值类型都是字符串。这表示,无论你将给环境变量设置的是 number
或 boolean
值,最终得到都是它的字符串表示。
在这里,我们将 PORT 变量设置为值 8000
,该值是一个数字。但是在 Node.js 服务器中,它变成了**"8000"**。如果需要将其转换为数字,可以使用 parseInt()
方法。
javascript
const PORT = parseInt(process.env.PORT, 10);
console.log(typeof PORT);
// number
如何获取具有默认值的环境变量
如果环境变量为 undefined
,还可以为它指定一个默认值,避免程序崩溃。
javascript
const PORT = parseInt(process.env.PORT, 10) || 3000;
console.log(PORT);
// 8000 or 3000
上面,我们使用了将 3000
定义为默认值。如果环境变量为 undefined
,PORT 常量的值就是 3000
。
什么是 .env
文件?
Node.js 中,.env
是一个用于声明多个环境变量的文件。通常,此文件位于项目根目录,看起来像一个文本文档,但只包含键值对,并支持使用哈希符号(#
)编写单行注释。
为什么要使用 .env
文件?
明明可以使用命令行参数(command line argument)直接传递环境变量,为什么还要引入这个 .env
文件呢?问题是,如果设置的环境变量数量少还好,如果很多(比如:10 个),那在命令行中管理将非常困难。这就是为什么开发人员大多数时候喜欢使用 .env
文件来存储环境变量的原因。
如何在 Node.js 中使用 .env
文件
现在我们已经知道为什么要使用 .env
文件存储环境变量了。那么如何使用呢?也很简单,3 步就能搞定:
- 创建
.env
文件 - 安装
dotenv
包 - 在 Node.js 项目中使用
dotenv
加载.env
文件
步骤1:创建 .env 文件
首先,必须在你的项目根目录下创建一个名为 .env
的文件。这个文件中,你可以写所有的环境变量,每行一个。
每个变量由两个部分组成,由等号(=
)分隔。左边是键,右边是值。遵循之前看到的类似结构。下面是一个示例:
bash
PORT=8000
NODE_ENV=development
# API
API_KEY=K6fAWcc4a7T8I9lIMvVl28fRO02UQwnX
按照约定,环境变量的键统一使用大写字母。当然,你可以不用这么写,不过最好要统一写法。
步骤2:安装 dotenv 包
Node.js 不会自动加载你的 .env
文件。要从 .env
文件加载项目中的环境变量,最好的方式借助三方包,比较流行的方案是使用 dotenv
。
使用以下命令在项目中安装此软件包:
bash
$ npm install dotenv
现在用它来加载 .env
文件。
步骤3:在 Node.js 项目中加载 .env 文件
要在 Node.js 项目中加载 .env
文件,可以导入 dotenv
包的 config()
函数,再调用它。
javascript
const { config } = require('dotenv');
const express = require('express');
const app = express();
config();
app.get('/', (req, res) => {
res.send('Node.js is working!');
});
const PORT = parseInt(process.env.PORT) || 3000;
app.listen(PORT, () => {
console.log('Server is running on port ' + PORT);
});
在这个例子中,在 Node.js 应用入口文件中导入并调用了 config()
函数。现在,process.env
对象中将包含来自 .env
文件的所有环境变量。
如果你不想在 JavaScript 文件中导入和使用 config()
函数,还有另一种方法来加载 .env
文件,就是在命令行通过指定 -r
参数(或是 --require
)的方式:
bash
$ node -r dotenv/config app.js
dotenv/config
所对应的文件内部会自动加载你的 .env
文件,然后再启动服务器。但在开发过程阶段,我们可能希望使用 nodemon
来启动服务器,方便修改后重启服务器。
bash
$ nodemon -r dotenv/config app.js
通过这种方式,你还可以从服务器内部通过 process.env
对象来访问环境变量。
两种方式,没有好坏之分,大家可以按需使用。
环境变量在 Node.js 中是如何工作的?
当 Node.js 应用程序启动时,它会创建一个新的子进程。然后,该进程从父进程接收环境变量,Node.js 解析所有环境变量用于创建 process.env
对象,这也就是为什么,如果更新或添加新的环境变量,需要手动重新启动服务器的原因。
另外需要注意的是,开发环境使用的 nodemon
包,你可能会认为当你修改 .env
文件后,这个包会重启服务器,你就能在服务器内拿到最新的环境变量,并不是!nodemon
并不会重新创建子进程,因此每次修改 .env
后,你都必须手动重新执行一遍服务器启动。
在 package.json
文件添加脚本
使用脚本,你可以轻松地启动或停止服务器,而无需每次都手动编写命令。不过,我们需要在 package.json
文件中添加脚本。
json
{
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
}
我们增加了两个脚本 start
和 dev
,后面的值,就是在执行脚本时,对应会执行的指令。
dev
脚本用于启动服务器进行开发。它将使用 nodemon
包。所以,当我们更新代码时,我们的服务器会自动重新启动。
bash
$ npm run dev
start
脚本则使用 node
在生产环境中启动服务器。
bash
$ npm run start
总结
本文,我们学习了如何在 Node.js 应用程序中设置和使用环境变量。环境变量主要用于存在我们项目中的敏感信息,可以灵活地为不同的环境(如开发和生产)设置应用程序,而无需修改源代码。
感谢阅读,Happy coding:)