Heroku生产与开发环境下切换process.env.DATABASE_URL最优方案咨询
最优实现方案是多环境独立.env文件配合启动脚本指定加载,完全不需要在业务代码中加入任何环境判断逻辑,符合十二因子应用的配置分离原则,具体落地方式如下:
具体实现步骤
- 准备两份配置文件
在项目根目录创建.env.development(本地开发用)和.env.production(仅本地调试生产配置时用),两个文件都加入.gitignore,避免敏感配置泄露。.env.development示例内容:
- 准备两份配置文件
DATABASE_URL=postgresql://user:password@localhost:5432/dev_db # 其他开发环境专属配置
- 安装配置加载工具
安装dotenv-cli作为开发依赖,用来在启动时指定加载的环境文件,跨平台兼容性优于手动写bash脚本:npm install dotenv-cli --save-dev
- 安装配置加载工具
- 配置启动脚本
在package.json的scripts字段中添加对应启动命令:
- 配置启动脚本
{ "scripts": { "dev": "dotenv -e .env.development nodemon server.js", "start": "node server.js" } }
这里start命令是给Heroku平台用的,Heroku会自动注入生产环境的DATABASE_URL以及其他你在Heroku后台配置的环境变量,不需要加载本地的.env.production文件。
- 代码中直接使用变量
业务代码里不需要任何环境判断,直接读取process.env.DATABASE_URL即可:
- 代码中直接使用变量
const { Pool } = require('pg'); const pool = new Pool({ connectionString: process.env.DATABASE_URL });
不推荐在.env内写判断逻辑方案的原因
- .env是纯静态键值对配置文件,本身没有内置逻辑判断能力,要实现判断需要额外编写解析代码,反而会在项目中引入不必要的环境判断逻辑,不符合你的需求。
- 逻辑写入配置文件会破坏配置的可维护性,后续新增环境(如测试环境)时改造成本更高。
内容的提问来源于stack exchange,提问作者Andrii Antoniuk
相关产品推荐
相关产品推荐

