在node中使用.env 文件


.env 文件是一种简单的文本文件,用于存储环境变量,通常用于在开发和生产环境中配置应用程序。文件中的内容以键值对的形式存储,每一行代表一个环境变量的设置,格式为 KEY=VALUE。

.env 文件的用途

.env 文件的主要作用是将应用程序的配置与代码分离,尤其是那些敏感信息或可能因环境不同而变化的配置项(如数据库凭证、API 密钥等)。通过 .env 文件,开发人员可以避免将敏感数据直接硬编码在代码中,并且可以轻松切换不同的环境配置。

dotenv介绍

dotenv 是一个流行的 Node.js 库,用于将环境变量加载到 Node.js 应用程序中,特别是从一个名为 .env 的文件中。它提供了一种方便的方式来管理应用程序的配置,尤其是在开发和生产环境中。

主要功能

  1. 加载环境变量dotenv 可以读取 .env 文件,并将其内容加载到 process.env 中,使得应用程序可以方便地访问这些变量。

  2. 支持默认值:你可以为环境变量设置默认值,以确保在某些变量未定义时应用程序仍然可以正常工作。

  3. 简化配置管理:通过集中管理环境变量,dotenv 有助于将敏感信息(如 API 密钥、数据库凭据等)与应用程序代码分离,从而提高安全性和可维护性。

    1. 安装 dotenv

使用 npm 或 yarn 安装 dotenv

1
2
3
npm install dotenv
# 或者
yarn add dotenv

2. 创建 .env 文件

在项目根目录下创建一个 .env 文件,内容为键值对格式,通常为:

1
2
3
4
5
PORT=3000
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
API_KEY=your_api_key_here

3. 在应用程序中引入 dotenv

在项目的入口文件(通常是 index.jsapp.js)中引入并配置 dotenv

1
2
3
4
require('dotenv').config();

console.log(`Server running on port: ${process.env.PORT}`);
console.log(`Connecting to database at ${process.env.DB_HOST}`);

4. 使用环境变量

一旦加载了 .env 文件中的变量,你就可以在应用程序的任何地方通过 process.env 访问它们:

1
2
3
const dbUser = process.env.DB_USER;
const dbPass = process.env.DB_PASS;
console.log(`Connecting to the database with user: ${dbUser}`);

注意事项

  1. 安全性:确保将 .env 文件添加到 .gitignore 文件中,以防止它被意外提交到版本控制系统中,从而泄露敏感信息。

    .gitignore 文件中添加以下内容:

    1
    .env
  2. 环境变量的类型:所有从 .env 文件中读取的值都是字符串。如果你需要其他类型(如布尔值、数字),你需要在代码中进行转换。

  3. 加载多个 .env 文件:如果需要在不同环境中使用不同的配置,可以创建多个 .env 文件(例如 .env.development, .env.production),并在代码中根据环境手动加载适当的文件:

    1
    2
    3
    const path = require('path');
    const envFile = process.env.NODE_ENV === 'production' ? '.env.production' : '.env.development';
    require('dotenv').config({ path: path.resolve(__dirname, envFile) });

示例

这是一个使用 dotenv 的完整示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// index.js
require('dotenv').config();

const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
res.send(`Hello, world! Running on port: ${port}`);
});

app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});

node原生支持

在 Node.js 版本 20.6.0 及更高版本中,Node.js 自带了对 .env 文件的原生支持,不需要额外安装 dotenv 库。这使得你可以直接在应用中加载 .env 文件,而无需依赖第三方库。

使用 Node.js 原生 .env 支持的方法:

  1. 在根目录创建 .env 文件
    跟之前的方式相同,创建 .env 文件并定义你的环境变量。例如:

    1
    2
    3
    4
    PORT=3000
    DB_HOST=localhost
    DB_USER=admin
    DB_PASS=secretpassword
  2. 通过 --env-file 参数加载 .env 文件
    启动 Node.js 程序时,通过 --env-file 参数指定 .env 文件的位置。

    1
    node --env-file=.env index.js

    这样,Node.js 会自动解析并将 .env 文件中的变量加载到 process.env 对象中,无需 dotenv 库。

示例

假设你的项目目录中有一个 index.js 文件,内容如下:

1
2
console.log(`Server will run on port: ${process.env.PORT}`);
console.log(`Database host is: ${process.env.DB_HOST}`);

启动这个项目:

1
node --env-file=.env index.js

输出结果将是:

1
2
Server will run on port: 3000
Database host is: localhost

优势

  • **无需安装 dotenv**:直接使用 Node.js 内置功能来加载 .env 文件,减少了依赖。
  • 简化的命令行参数:通过 --env-file 直接加载文件,便于配置。

版本要求

为了使用这项功能,你需要 Node.js 20.6.0 或更高版本。如果你正在使用旧版本的 Node.js(如 20.6.0 之前的版本),仍然需要使用 dotenv 等第三方库。

你可以通过以下命令检查你的 Node.js 版本:

1
node -v

如果版本低于 20.6.0,你可以通过升级 Node.js 来获得这个原生支持。

process.loadEnvFile()介绍

process.loadEnvFile() 是从 Node.js 21.7.0 版本开始引入的一个新方法,它用于进一步简化 .env 文件中环境变量的加载过程。这个方法允许你在运行时通过代码动态加载 .env 文件,而不需要依赖外部库如 dotenv,并且不再需要在启动命令中指定 --env-file 标志。

主要功能

  • 动态加载 .env 文件process.loadEnvFile() 可以在应用运行时通过代码加载 .env 文件,这意味着你可以在程序逻辑中按需加载环境变量。

  • 无需外部库:不需要使用 dotenv 或其他类似的库。它提供了 Node.js 原生的环境变量加载支持。

  • 文件路径灵活:你可以指定加载的 .env 文件的路径,方便在不同环境或配置下使用不同的文件。

使用示例

  1. 假设有一个 .env 文件,内容如下:

    1
    2
    USER_NAME='Paweł Grzybek'
    API_KEY='your_api_key'
  2. 在 Node.js 代码中使用 process.loadEnvFile() 方法加载这个 .env 文件:

    1
    2
    3
    4
    5
    6
    // index.js
    (async () => {
    await process.loadEnvFile('.env');
    console.log(`Hi ${process.env.USER_NAME} 👋`);
    console.log(`Your API Key: ${process.env.API_KEY}`);
    })();
  3. 执行脚本:

    1
    node index.js

    输出结果:

    1
    2
    Hi Paweł Grzybek 👋
    Your API Key: your_api_key

方法说明

  • 异步方法process.loadEnvFile() 是异步方法,因此你需要使用 awaitthen() 来确保 .env 文件正确加载后再使用环境变量。

  • 错误处理:如果文件不存在或读取失败,你可以使用 try...catch 来捕获错误并处理异常情况。

    1
    2
    3
    4
    5
    try {
    await process.loadEnvFile('.env');
    } catch (err) {
    console.error('Failed to load .env file', err);
    }

参数

  • **filePath**:你可以指定 .env 文件的路径(相对于当前工作目录),例如 '.env''config/.env.production' 等。
  • options(可选):未来可能会扩展支持额外的选项,类似 dotenv 的配置参数,比如编码或变量替换等(截至 21.7.0 版本,还没有提供这些选项)。

使用场景

  • 按需加载:有时你可能需要在不同阶段或模块中加载不同的环境变量,这种情况下 process.loadEnvFile() 可以灵活地满足需求,而不像 dotenv 那样必须在应用启动时加载所有变量。
  • 简化配置:对于简单的项目,使用 process.loadEnvFile() 可以避免额外安装第三方库,简化配置过程。

总结

node读取环境变量的配置随着node版本的变化,使用方式也不同,可以根据个人使用的node版本进行选择。

  • process.loadEnvFile() 是 Node.js 21.7.0 版本新增的一个方法,用于动态加载 .env 文件。
  • Node.js 内置功能来加载 .env 文件,需要 Node.js 20.6.0 或更高版本。
  • dotenv 是一个流行的 Node.js 库,它提供了一种方便的方式来管理应用程序的配置,无版本兼容问题