Nestjs与Prisma多环境变量文件解决方案
前言
在一个稍微正式点的项目中,它的环境变量文件肯定多个的,一般会有开发用的环境变量文件,正式上线的环境变量文件,测试用的环境变量文件,甚至还有更多,但是在nestjs和prisma的官方文档中,都是只用一个环境变量文件.env
,显然有点弱了,为此写一篇关于如何使用多环境变量文件的教程。
依赖安装
pnpm i cross-env dotenv dotenv-cli -D
理论上讲dotenv
可以不用明确安装,但是但是安装一些,以后也用得到,比较是一个基建类的库,用于解决环境变量相关方面。
cross-env
用于指定NODE_ENV
。
dotenv-cli
是给prisma用的。
创建环境变量文件
在项目根目录创建两个环境变量文件:
.env.development
# 模式
NODE_ENV="development"
# prisma
DATABASE_URL="mysql://root:@localhost:3306/nest-blog"
.env.production
# 模式
NODE_ENV="production"
# prisma
DATABASE_URL="mysql://root:@localhost:3306/nest-blog"
这里只是示例,各种根据自己的需要调整具体的内容。
nestjs配置多环境变量
先通过cross-env
来指定nestjs的运行环境模式。
配置packag.json中的"scripts"
。
{
"scripts": {
"build": "cross-env NODE_ENV=production nest build",
"start": "cross-env NODE_ENV=development nest start",
"start:dev": "cross-env NODE_ENV=development nest start --watch",
"start:debug": "cross-env NODE_ENV=development nest start --debug --watch",
"start:prod": "cross-env NODE_ENV=production node dist/main",
}
}
此时我们在项目中就可以通过process.env.NODE_ENV
得到配置的环境模式。
然后我们就可以通过@nestjs/config
这个官方模块,指定envFilePath
字段了。
如果你没有安装,可以安装一下:
pnpm i @nestjs/config
然后我们在app.module.ts
中这么配置:
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { ConfigModule } from "@nestjs/config";
const NODE_ENV = process.env.NODE_ENV;
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: NODE_ENV === "development" ? ".env.development" : `.env.${NODE_ENV}`
})
],
controllers: [AppController],
providers: [AppService]
})
export class AppModule {}
这样我们在后续使用的时候,通过ConfigModule
模块的ConfigService
就能拿到对应的环境变量配置了。
import { Controller, Get } from "@nestjs/common";
import { AppService } from "./app.service";
import { ConfigService } from "@nestjs/config";
@Controller()
export class AppController {
constructor(
private appService: AppService,
private config: ConfigService
) {}
@Get()
getHello(): string {
console.log(this.config.get("DATABASE_URL")); //获取到了
return this.appService.getHello();
}
}
由于我们可以通过process.env.NODE_ENV
得到配置的环境模式,那么在@nestjs/config
中我们设置命名空间也能更加方便了,可以通过这个实现一些配置变化,当然这个不是本期重点,有兴趣自己看文档了解一下即可。
Prisma环境变量配置
默认prisma它只会读取.env
里面的环境变量,官方预设了:DATABASE_URL
字段,现在我们希望他能读取到.env.development
或者.env.production
里面的DATABASE_URL
字段。
以开发使用的两个常用命令为例:
packag.json
{
"scripts": {
"prisma:migrate": "dotenv -e .env.development prisma migrate dev",
"prisma:reset": "dotenv -e .env.development prisma migrate reset",
}
}
通过dotenv -e .env.development
指定在运行时加载.env.development
环境变量。
其他地方不用改动。
当我们运行prisma:migrate
或者prisma:reset
时,就可以去指定的环境变量文件里取值,大家可以根据自己需要调整环境变量文件名。
当然这只是开发时会用到的,等之后我了解到打包部署相关的内容,如果有变化,再来更新。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据