Node.js .env 配置指南:安全管理项目秘钥与多环境适配

在 Node.js 里用 .env 其实很简单,你可以把它理解成一个 "专门记密码和配置的小本本"------ 作用就是帮你管好项目里的各种设置(比如数据库密码、启动端口),既不会泄露隐私,又能灵活切换环境(本地开发 / 线上运行)。

一、为啥需要这个 "小本本"?

比如你写 Node.js 项目时,总得连数据库吧?数据库的账号密码要是直接写在代码里,万一代码传到 GitHub 上,别人就能看到你的密码了,多危险!

再比如,你本地开发用的数据库地址是 localhost,但项目上线后得用服务器的数据库地址,总不能每次上线都改代码里的地址吧?太麻烦了。

这个 .env 就是来解决这些问题的:把所有密码、地址、端口这些配置都记在里面,代码里只需要 "查小本本",既安全又方便切换。

二、具体咋用?分 4 步走:

1. 先装个 "读小本本的工具"

这个工具叫 dotenv,专门帮 Node.js 读 .env 里的内容。打开命令行,在你的项目文件夹里输入:

bash

复制代码
npm install dotenv

就像买了个 "放大镜",专门用来读这个小本本。

2. 建一个 "小本本"(.env 文件)

在你的项目文件夹里(和 package.json 同个位置),新建一个文件,名字就叫 .env(必须这个名,不然工具不认)。里面就写你需要的各种配置,格式很简单:名字=值,比如:

ini

ini 复制代码
# 数据库的地址,本地开发一般是 localhost
DB_HOST=localhost
# 数据库的端口,默认3306
DB_PORT=3306
# 数据库的账号
DB_USER=root
# 数据库的密码(这个千万别写在代码里!)
DB_PASSWORD=我家数据库的密码123
# 项目启动的端口,比如3000
PORT=3000
# 是不是调试模式(开发时开,上线时关)
DEBUG=true

就像在小本本上记:"数据库密码:xxx"、"启动端口:3000"。

3. 让代码 "看到小本本" 里的内容

打开你的项目入口文件(比如 app.jsindex.js),最开头 加上一句代码,让 dotenv 把小本本里的内容 "告诉" 代码:

javascript

运行

scss 复制代码
// 用工具读小本本
require('dotenv').config();

这一步就像 "打开小本本,让代码能看到里面的字"。

4. 代码里直接用这些配置

之后在代码里,想拿哪个配置,就用 process.env.名字 就行。比如:

javascript

运行

arduino 复制代码
// 比如你用 Express 启动服务器,端口就用小本本里的 PORT
const express = require('express');
const app = express();

// 从.env里拿端口(如果没写,就默认用3000)
const port = process.env.PORT || 3000;

// 启动服务器
app.listen(port, () => {
  console.log(`服务器跑在 http://localhost:${port} 啦`);
});

// 连数据库的时候,用小本本里的账号密码
const mysql = require('mysql2');
const db = mysql.createConnection({
  host: process.env.DB_HOST, // 从.env拿地址
  port: process.env.DB_PORT, // 从.env拿端口
  user: process.env.DB_USER, // 从.env拿账号
  password: process.env.DB_PASSWORD // 从.env拿密码
});

这样一来,代码里看不到具体的密码和地址,全靠 "查小本本",安全多了。

三、多环境切换(本地开发 / 线上运行)

你本地开发和项目上线时,配置肯定不一样(比如本地用自己的数据库,上线用服务器的)。可以建多个 "小本本",分别对应不同环境:

1. 建多个环境的 "小本本"

在项目根目录建这几个文件:

  • .env.development:本地开发用(比如数据库是 localhost
  • .env.production:线上运行用(比如数据库是服务器地址)

示例 .env.development

ini

ini 复制代码
DB_HOST=localhost
DB_PASSWORD=本地数据库密码
PORT=3000
DEBUG=true

示例 .env.production

ini

ini 复制代码
DB_HOST=服务器数据库地址
DB_PASSWORD=线上数据库密码
PORT=80
DEBUG=false

2. 启动时选环境

package.json 里加几个启动脚本,方便切换环境:

json

json 复制代码
{
  "scripts": {
    "dev": "NODE_ENV=development node app.js", // 启动开发环境
    "start": "NODE_ENV=production node app.js" // 启动生产环境
  }
}

然后在代码里,根据启动时选的环境,自动读对应 "小本本":

javascript

运行

javascript 复制代码
// 先判断当前是哪个环境(默认用开发环境)
const env = process.env.NODE_ENV || 'development';
// 读对应环境的小本本
require('dotenv').config({ path: `.env.${env}` });

四、关键注意事项(必看!)

1. 千万别把 "小本本" 传到网上!

.env 里全是密码这些隐私,绝对不能传到 GitHub 之类的代码仓库。解决办法:在 .gitignore 文件里加一行 .env(和多环境文件),像这样:

ini

bash 复制代码
# .gitignore 里要写这些
.env
.env.development
.env.production
node_modules/  # 这个本来就该有,忽略依赖包

2. 给团队留个 "空白模板"

团队其他人拿到代码,不知道 .env 里该写啥?可以建一个 .env.example 文件(这个能传到仓库),只写变量名和提示,比如:

ini

ini 复制代码
# .env.example(模板)
DB_HOST=localhost  # 数据库地址,本地填localhost
DB_PORT=3306       # 数据库端口,默认3306
DB_USER=你的用户名  # 换成你的数据库用户名
DB_PASSWORD=你的密码  # 换成你的数据库密码
PORT=3000

别人复制一份改名叫 .env,填自己的信息就行。

3. 注意 "类型转换"

.env 里的内容读出来都是 "字符串"。比如 PORT=3000 读出来是 "3000"(带引号),DEBUG=true 读出来是 "true"。用的时候得转成数字或布尔值:

javascript

运行

arduino 复制代码
// 字符串"3000"转成数字3000
const port = Number(process.env.PORT);

// 字符串"true"转成布尔值true
const isDebug = process.env.DEBUG === 'true';

4. 先 "打开小本本",再用内容

require('dotenv').config(); 必须写在代码最开头!如果放后面,其他代码早就跑起来了,还没读到配置,就会报错 "变量没定义"。

5. 线上服务器可以 "不用小本本"

项目上线到服务器(比如阿里云、Docker)时,不用传 .env.production。服务器本身能直接配置环境变量(在控制台填),代码里用 process.env.变量名 照样能读到,更安全。

这样一套流程下来,用 .env 管理配置就既安全又方便了,不用担心密码泄露,切换环境也不用改代码~

相关推荐
沢田纲吉3 小时前
《LLVM IR 学习手记(七):逻辑运算与位运算的实现与解析》
前端·c++·编译器
golang学习记3 小时前
从0死磕全栈之Next.js 重定向全指南:从基础跳转到大规模路由迁移
前端
Mapmost3 小时前
Mapmost地图引擎丨测绘资质“合规门票”
前端
JarvanMo4 小时前
不要在 SwiftUI 中使用 .onAppear() 进行异步(Async)工作——这就是它导致你的 App 出现 Bug 的原因。
前端
Moment4 小时前
Next.js 16 新特性:如何启用 MCP 与 AI 助手协作 🤖🤖🤖
前端·javascript·node.js
吃饺子不吃馅4 小时前
Canvas高性能Table架构深度解析
前端·javascript·canvas
一枚前端小能手4 小时前
🔄 重学Vue之生命周期 - 从源码层面解析到实战应用的完整指南
前端·javascript·vue.js
JarvanMo4 小时前
Flutter:借助 jnigen通过原生互操作(Native Interop)使用 Android Intent。、
前端
开开心心就好4 小时前
Word转PDF工具,免费生成图片型文档
前端·网络·笔记·pdf·word·powerpoint·excel