Node.js:学习如何设置和使用环境变量

原文链接:Easiest Way to Set & Use Environment Variables (.env) in Node.js,2023.02.19,by Robin

Node.js 中的环境变量用于安全地存储应用程序的敏感信息。因此,掌握如何正确地设置和使用环境变量对每个开发人员来说都是很重要的一项技能。

大多数情况下,新手开发会将一些重要信息写在源代码中,比如数据库凭据、API 密钥等,这是一种很危险的做法。大家可能会在使用环境变量时感觉很困难,这也是新手开发不愿意使用的原因,但使用起来其实并没有你想得这么难。

本文会以轻松的方式、一步一步引导大家学习如何在 Node.js 应用程序中设置和使用环境变量。学完本文后,你对环境变量将会有一个清晰的认识,环境变量相关问题也会迎刃而解。

但在开始之前,你需要满足以下前提:

  1. 电脑上安装了 Node.js 12+ 的环境
  2. 能访问 npmyarn 的包管理软件
  3. 对 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

这将设置 PORTNODE_ENV 环境变量。 PORTNODE_ENV 的值将分别为 8000development

但是如果你使用的是 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

主要的区别是这个对象的属性值类型都是字符串。这表示,无论你将给环境变量设置的是 numberboolean 值,最终得到都是它的字符串表示。

在这里,我们将 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 步就能搞定:

  1. 创建 .env 文件
  2. 安装 dotenv
  3. 在 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"
  },
}

我们增加了两个脚本 startdev,后面的值,就是在执行脚本时,对应会执行的指令。

dev 脚本用于启动服务器进行开发。它将使用 nodemon 包。所以,当我们更新代码时,我们的服务器会自动重新启动。

bash 复制代码
$ npm run dev

start 脚本则使用 node 在生产环境中启动服务器。

bash 复制代码
$ npm run start

总结

本文,我们学习了如何在 Node.js 应用程序中设置和使用环境变量。环境变量主要用于存在我们项目中的敏感信息,可以灵活地为不同的环境(如开发和生产)设置应用程序,而无需修改源代码。

感谢阅读,Happy coding:)

相关推荐
腾讯TNTWeb前端团队5 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰8 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪9 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy9 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom10 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom10 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom10 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom10 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom10 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试