NestJs學習之路(2)- 配置文件

前言

Typeorm使用章節中,咱們將數據庫鏈接信息直接寫在app.module.ts中,但在實際開發中,會根據環境變量來加載不一樣配置項,也不會將一些配置信息直接寫在代碼中,爲此nest官方提供了@nestjs/config這個模塊來實現上述需求。mysql

1、.env文件加載環境變量

@nestjs/config依賴於 dotenv,能夠經過key=value形式配置環境變量,項目會默認加載根目錄下的.env文件,咱們只需在app.module.ts中引入ConfigModule,再使用ConfigModule.forRoot()方法便可。

.envgit

DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=root
DB_NAME=blogs

src/app.module.tsgithub

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot(),
    TypeOrmModule.forRootAsync({
      useFactory: () => ({
        type: 'mysql',
        host: process.env.DB_HOST,
        port: process.env.DB_PORT,
        username: process.env.DB_USERNAME,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_NAME,
        timezone: 'UTC',
        charset: 'utf8mb4',
        entities: ['./**/*.entity.js'],
        synchronize: true,
        logging: true,
    })})],
  // 也可以使用自定義.env文件
  /*
  imports: [ConfigModule.forRoot({
    envFilePath: '.development.env',
  })];
  */
})
export class AppModule {}

2、加載自定義配置文件

上面咱們把數據庫的信息都寫在了環境變量中,再經過process.env.key形式去獲取,但可能存在下面一種需求:config文件夾下存在development.ts,test.ts,production.ts三個配置文件,需根據NODE_ENV加載不一樣配置文件;此外須要一種擴展性更好的配置文件格式支持,好比.ts,.js文件,這時能夠將數據庫配置項等做爲一個對象,而不單單是key=value的格式,同時也能附加註釋、說明等內容。下面咱們在config文件夾中增長配置文件,app.module.ts文件再做修改,數據庫信息等移至配置文件中。

增長 src/config/development.tssql

export default {
    // 端口
    port:  parseInt(process.env.PORT, 10) || 3000,
    // 是否開啓swagger
    enableSwagger: true,
    // 數據庫配置
    DATABASE_CONFIG: {
        type: 'mysql',
        host: 'localhost',
        port: 3306,
        username: 'root',
        password: '',
        database: 'blogs',
        timezone: 'UTC',
        charset: 'utf8mb4',
        entities: ['./**/*.entity.js'],
        synchronize: true,
        logging: true,
    },
};

增長 src/config/index.ts數據庫

import developmentConfig from './development';
import testConfig from './test';
import productionConfig from './production';

const configs = {
    development: developmentConfig,
    test: testConfig,
    production: productionConfig,
};
const env = process.env.NODE_ENV || 'development';

export default () => configs[env];

修改 src/app.module.tsapp

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ArticleModule } from './controllers/admin/article/article.module';
import { ConfigModule, ConfigService } from '@nestjs/config';
import customConfig from './config';

@Module({
  imports: [
      ConfigModule.forRoot({
        isGlobal: true, // 做用於全局
        load: [customConfig], // 加載自定義配置項
      }),
      TypeOrmModule.forRootAsync({
        imports: [ConfigModule], // 數據庫配置項依賴於ConfigModule,需在此引入
        useFactory: (configService: ConfigService) => configService.get('DATABASE_CONFIG'),
        inject: [ConfigService], // 記得注入服務,否則useFactory函數中獲取不到ConfigService
    }),
    ArticleModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

根據官方文檔configuration和本身的需求,目前經過上面一種形式實現,若是您有更好的實踐方式歡迎多多分享。ide

相關文章
相關標籤/搜索