前言
Typeorm使用章节中,我们将数据库连接信息直接写在app.module.ts中,但在实际开发中,会根据环境变量来加载不同配置项,也不会将一些配置信息直接写在代码中,为此nest官方提供了@nestjs/config
这个模块来实现上述需求。
一、.env文件加载环境变量
@nestjs/config
依赖于dotenv,可以通过key=value形式配置环境变量,项目会默认加载根目录下的.env文件,我们只需在app.module.ts中引入ConfigModule,再使用ConfigModule.forRoot()方法即可。
.env
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=root
DB_NAME=blogs
src/app.module.ts
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
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
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和自己的需求,目前通过上面一种形式实现,如果您有更好的实践方式欢迎多多分享。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。