在开发nestjs应用时,连接数据库的逻辑很简单,主要是如何有效的区分开发换进和生产环境,前面我们有文章介绍了可以使用dotenv来解决,其本质原理是读取.env的配置文件给process.env对象的属性赋值,不能直接操作process.env的指向,只能操作其属性。在读取配置文件之前,我们先判断当前的环境变量,确定是哪种环境。
在看前面员工写的代码是又发现了一种方式,思路和dotenv实现差不多,不过这位同学没有依赖dotenv,所以特此记录,他的代码主要分为如下几步:
1、定义检查函数
代码语言:javascript复制
import { Injectable } from '@nestjs/common';
import { env_dev } from "./env.dev"
import { env_prod } from "./env.prod"
@Injectable()
export class CheckEnv {
static init ():void{
let env = {};
if (process.env.NODE_ENV == "dev") {
console.log("当前环境为:开发环境,", process.env.NODE_ENV)
env = env_dev
}else if(process.env.NODE_ENV == "prod"){
env = env_prod
console.log("当前环境为:正式环境,", process.env.NODE_ENV)
}else{
process.env.NODE_ENV = "dev"
env = env_dev
}
process.env.dbhost = env['dbhost']
process.env.dbport = env['dbport']
process.env.dbusername = env['dbusername']
process.env.dbpassword = env['dbpassword']
process.env.dbname = env['dbname']
process.env.APIPORT = env['APIPORT'] //本项目对外开放的端口
process.env.alfKey = env['alfKey']
}
static check():void{
console.log("集群环境 检查环境变量 .......")
if (!process.env.dbhost){
console.log("缺失环境变量参数 dbhost");
process.exit(-1);
}else{
console.log("环境变量 dbhost",process.env.dbhost)
}
if (!process.env.dbport){
console.log("缺失环境变量参数 dbport");
process.exit(-1);
}else{
console.log("环境变量 dbport",process.env.dbport)
}
if (!process.env.dbusername){
console.log("缺失环境变量参数 dbusername");
process.exit(-1);
}else{
console.log("环境变量 dbusername",process.env.dbusername)
}
if (!process.env.dbpassword){
console.log("缺失环境变量参数 dbpassword");
process.exit(-1);
}else{
console.log("环境变量 dbpassword******")
}
if (!process.env.dbname){
console.log("缺失环境变量参数 dbname");
process.exit(-1);
}else{
console.log("环境变量 dbname",process.env.dbname)
}
}
}
逻辑很简单,定义了一个类,类中有两个方法,一个初始化,一个检查,初始化中判断了环境变量并未process.env的属性赋值
检查函数则是检查每一个环境变量,防止代码中疏忽的覆盖,因为process是全局变量。
2、在入口文件中执行
代码语言:javascript复制import {CheckEnv} from './common/env/checkEnv';
CheckEnv.init();
CheckEnv.check()
3、在根模块中直接使用process.env来获取配置。
代码语言:javascript复制@Module({
imports: [
ServeStaticModule.forRoot({
rootPath: join(__dirname, '..', 'public'),
}),
TypeOrmModule.forRoot({
type: 'mysql',
host: process.env.dbhost,
port: Number(process.env.dbport),
username: process.env.dbusername,
password: process.env.dbpassword,
database: process.env.dbname,
entities: [ AccountType , AlfUser, AlfUserRecord,AlfDevice, AlfUserGroup ,
Course, CourseWorker,CourseStudent,
synchronize: true,
logging: false,
}),
AuthModule,
AlfModule,
AlfUserModule,
AlfDeviceModule,
AlfUserGroupModule,
EventsModule
],
controllers: [AppController],
providers: [AppService],
})
以上便是我对代码中全局环境变量配置的理解和使用,希望对你有所帮助。