Typeorm使用章節中,咱們將數據庫鏈接信息直接寫在app.module.ts中,但在實際開發中,會根據環境變量來加載不一樣配置項,也不會將一些配置信息直接寫在代碼中,爲此nest官方提供了@nestjs/config
這個模塊來實現上述需求。mysql
@nestjs/config
依賴於
dotenv,能夠經過key=value形式配置環境變量,項目會默認加載根目錄下的.env文件,咱們只需在app.module.ts中引入ConfigModule,再使用ConfigModule.forRoot()方法便可。
.env
git
DB_HOST=localhost DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=root DB_NAME=blogs
src/app.module.ts
github
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 {}
上面咱們把數據庫的信息都寫在了環境變量中,再經過process.env.key形式去獲取,但可能存在下面一種需求:config文件夾下存在development.ts,test.ts,production.ts三個配置文件,需根據NODE_ENV加載不一樣配置文件;此外須要一種擴展性更好的配置文件格式支持,好比.ts,.js文件,這時能夠將數據庫配置項等做爲一個對象,而不單單是key=value的格式,同時也能附加註釋、說明等內容。下面咱們在config文件夾中增長配置文件,app.module.ts文件再做修改,數據庫信息等移至配置文件中。
增長 src/config/development.ts
sql
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.ts
app
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