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=developmentLinux:
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]文件。
复杂环境
有时候,项目里的需要区分环境变量很多,更加灵活,就需要简单封装一下配置模块:
- 加载配置文件 这里使用的是
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
};- 定义类型
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
}- 加载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 { }- 使用变量 这里,通过获取配置中
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 { }写在最后
环境变量&&配置,所以需要区分环境的才需要放置进来,而且其它的静态变量,可以通过其余文件,直接导入到配置模块中。
