在 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.js 或 index.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 管理配置就既安全又方便了,不用担心密码泄露,切换环境也不用改代码~