zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

nestjs连接数据库的另一种方式

2023-04-18 15:57:10 时间

在开发nestjs应用时,连接数据库的逻辑很简单,主要是如何有效的区分开发换进和生产环境,前面我们有文章介绍了可以使用dotenv来解决,其本质原理是读取.env的配置文件给process.env对象的属性赋值,不能直接操作process.env的指向,只能操作其属性。在读取配置文件之前,我们先判断当前的环境变量,确定是哪种环境。

在看前面员工写的代码是又发现了一种方式,思路和dotenv实现差不多,不过这位同学没有依赖dotenv,所以特此记录,他的代码主要分为如下几步:

1、定义检查函数


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、在入口文件中执行

import {CheckEnv} from './common/env/checkEnv';
CheckEnv.init();
CheckEnv.check()

3、在根模块中直接使用process.env来获取配置。

@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],
})

以上便是我对代码中全局环境变量配置的理解和使用,希望对你有所帮助。