在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

npm install dotenv
# 或者
yarn add dotenv

2. 创建 .env 文件

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

PORT=3000
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
API_KEY=your_api_key_here

3. 在应用程序中引入 dotenv

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

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 访问它们:

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 文件中添加以下内容:

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

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

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

示例

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

// 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 文件并定义你的环境变量。例如:

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

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

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

示例

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

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

启动这个项目:

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

输出结果将是:

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 版本:

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 文件,内容如下:

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

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

    node index.js
    

    输出结果:

    Hi Paweł Grzybek 👋
    Your API Key: your_api_key
    

方法说明

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

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

    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 库,它提供了一种方便的方式来管理应用程序的配置,无版本兼容问题
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339