前言

在一个稍微正式点的项目中,它的环境变量文件肯定多个的,一般会有开发用的环境变量文件,正式上线的环境变量文件,测试用的环境变量文件,甚至还有更多,但是在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

文档:@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时,就可以去指定的环境变量文件里取值,大家可以根据自己需要调整环境变量文件名。

当然这只是开发时会用到的,等之后我了解到打包部署相关的内容,如果有变化,再来更新。

分类: Nest.js 标签: 环境prismaNestjs多环境

评论

暂无评论数据

暂无评论数据

目录