Skip to content

NestJS——环境配置篇

环境变量

通过在package.json设置NODE_ENV,然后在代码中通过process.env.NODE_ENV即可拿到变量。

JSON
{
    ...
    "scripts":{
        "start:dev": "set NODE_ENV=development&& nest start --watch",
        "start:prod": "NODE_ENV=production node dist/src/main",
    }
    ...
}

直接设置需要区分Node运行环境: Win:

sh
set NODE_ENV=development

Linux:

sh
NODE_ENV=development

或者借助一些第三方库:如cross-env:

cross-env NODE_ENV=development nest start

这样就能在代码中访问到环境变量:

ts

export const mode = process.env.NODE_ENV // development

加载配置

简单环境

直接通过@nestjs/config加载对应的配置文件即可:

ts
import { Module } from '@nestjs/common';
import { ConfigModule as NestConfigModule } from "@nestjs/config"
@Module({
  imports: [
    NestConfigModule.forRoot({
      isGlobal: true,
      envFilePath: [`.env.${process.env.NODE_ENV}`],
    })
  ],
  exports: [],
})
export class ConfigModule { }

这样就会直接加载项目根目录下的.env.[mode]文件。

复杂环境

有时候,项目里的需要区分环境变量很多,更加灵活,就需要简单封装一下配置模块:

  1. 加载配置文件 这里使用的是yaml,也可使用其它库,甚至可以自己手动解析. 获取文件内配置内容,解析为变量,导出使用。
ts
import * as fs from 'fs'
import { join } from 'path'
import { load } from 'js-yaml'
import IConfiguration from './configuration.interface'
const loadEnvFile = (mode) => {
    const envPath = join(process.cwd(), `.env.${mode}.yaml`)
    console.log(`[env path] ${envPath}`)
    try {
        return fs.readFileSync(envPath, 'utf8')
    } catch (err) {
        console.log('env file is not exist', err)
        return ""
    }
}
const env = load(loadEnvFile(process.env.NODE_ENV)) as IConfiguration
export const PORT = env.http.port;
export default () => {
    return env
};
  1. 定义类型
ts
export interface IMysql {
    port: number
    host: string
    name: string
    user: string
    password: string
}

export interface IDb {
    mysql: IMysql
}

interface IHttp {
    port: number
}

export default interface IConfiguration {
    http: IHttp
    db: IDb
}
  1. 加载NestModule
ts
import { Module } from '@nestjs/common';
import { ConfigModule as NestConfigModule } from "@nestjs/config"
import configuration from './configuration'
@Module({
  imports: [
    NestConfigModule.forRoot({
      isGlobal: true,
      load: [configuration]
    })
  ],
  exports: [],
})
export class ConfigModule { }
  1. 使用变量 这里,通过获取配置中mysql配置,进行链接数据库,从能区分生产、测试,开发环境。
ts
import { MikroOrmModule } from '@mikro-orm/nestjs';
import { Module } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { ConfigModule } from 'src/config/config.module';
import { IMysql } from 'src/config/configuration.interface';
import mikroOrmConfig from './mikro-orm.config'

@Module({
  imports: [
    MikroOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => {
        return mikroOrmConfig(configService.get<IMysql>('db.mysql'));
      },
    })
  ]
})
export class DbModule { }

写在最后

环境变量&&配置,所以需要区分环境的才需要放置进来,而且其它的静态变量,可以通过其余文件,直接导入到配置模块中。