背景说明
开始学习 NestJS 框架, 在使用 nest cli
通过 nest new project
命令创建了一个项目, 在链接数据库的时候, 有一些配置项想要使用 .env
文件设置环境变量在项目里使用. 像其他项目一样, 在根目录分别创建 .env.development
.env.production
两个文件, 文件内容分别为:
env
# .env.development
DB_HOST=dev-db-server
# .env.production
DB_HOST=production-db-server
在 main.ts
里去导入使用:
ts
import * as dotenv from 'dotenv';
dotenv.config();
console.log(process.env.DB_HOST);
这时, 打印为 undefined
解决
直接说结论:
-
确保安装了安装
dotenv
-
修改
package.json
里的配置项, 在start:dev
和start:prod
命令里分别加上NODE_ENV=
+ 环境名:json"scripts": { "start:dev": "NODE_ENV=development nest start --watch", "start:prod": "NODE_ENV=production node dist/main" },
-
重启项目, 如果此时已经能按预期输出了, 那就恭喜你, 不用进行下面的操作了, 如果还不行, 继续下一步
-
不出意外这时候报错
'NODE_ENV' 不是内部或外部命令,也不是可运行的程序
-
原因: 意味着在尝试执行
pnpm start:dev
命令时,系统无法识别NODE_ENV
这个环境变量。这通常发生在 Windows 系统中,因为 Windows 的环境变量设置和 Unix/Linux 系统有所不同 -
解决: 使用
cross-env
包来确保环境变量在所有平台上都能正确设置:jspnpm add --save-dev cross-env # 或 npm install --save-dev cross-env
-
-
安装好后, 再次修改
package.json
里的配置项, 在上一次修改的基础上, 分别在开头添加cross-env
json"scripts": { "start:dev": "cross-env NODE_ENV=development nest start --watch", "start:prod": "cross-env NODE_ENV=production node dist/main" },
-
重新运行项目, 这时候环境变量打印的结果还是不理想(环境类型错乱 或 只读取.env 文件, 不读取对应环境类型), 可以在稍微改造一下
main.js
:
js
import * as dotenv from 'dotenv';
if (process.env.NODE_ENV === 'development') {
dotenv.config({ path: '.env.development' }); // 加载开发环境 env 文件
} else if (process.env.NODE_ENV === 'production') {
dotenv.config({ path: '.env.production' }); // 加载生产环境 env 文件
} else {
dotenv.config(); // 加载默认的.env文件
}
console.log(process.env.NODE_ENV); // development
console.log(process.env.DB_HOST); // dev-db-server
- 大功告成, 继续愉快的开发吧!
各个包版本:
json
"dependencies": {
"@nestjs/common": "^10.0.0",
"@nestjs/core": "^10.0.0",
"@nestjs/mapped-types": "*",
"@nestjs/platform-express": "^10.0.0",
"@nestjs/sequelize": "^10.0.1",
"@nestjs/typeorm": "^10.0.2",
"dotenv": "^16.4.5",
"mysql2": "^3.9.4",
"reflect-metadata": "^0.2.0",
"rxjs": "^7.8.1",
},