文章目錄
- @[toc]
- 一、環境搭建與基礎配置
- 1.1 安裝驗證(新增完整示例)
- 1.2 多環境配置示例
- 二、模塊化配置實戰
- 2.1 根模塊高級配置
- 2.2 數據庫模塊專用配置
- 三、配置獲取最佳實踐
- 3.1 類型安全獲取示例
- 3.2 枚舉工程化示例
- 四、高級場景示例
- 4.1 動態配置熱更新
- 4.2 多層級配置合并
- 五、實用配置技巧
- 5.1 配置智能提示
- 5.2 多層級配置合并
- 六、項目結構建議
- 推薦配置目錄結構
- 分層配置示例
- 七、調試技巧
- 7.1 配置查看命令
- 7.2 熱重載配置(開發環境)
- 八、安全實踐
- 8.1 敏感信息加密
文章目錄
- @[toc]
- 一、環境搭建與基礎配置
- 1.1 安裝驗證(新增完整示例)
- 1.2 多環境配置示例
- 二、模塊化配置實戰
- 2.1 根模塊高級配置
- 2.2 數據庫模塊專用配置
- 三、配置獲取最佳實踐
- 3.1 類型安全獲取示例
- 3.2 枚舉工程化示例
- 四、高級場景示例
- 4.1 動態配置熱更新
- 4.2 多層級配置合并
- 五、實用配置技巧
- 5.1 配置智能提示
- 5.2 多層級配置合并
- 六、項目結構建議
- 推薦配置目錄結構
- 分層配置示例
- 七、調試技巧
- 7.1 配置查看命令
- 7.2 熱重載配置(開發環境)
- 八、安全實踐
- 8.1 敏感信息加密
一、環境搭建與基礎配置
1.1 安裝驗證(新增完整示例)
# 安裝后檢查控制臺輸出
$ npm install @nestjs/config
+ @nestjs/config@9.0.0
added 1 package in 2s# 驗證導入能力
// app.module.ts
import { ConfigModule } from '@nestjs/config'; // 無報錯即成功# 查看版本信息
$ npm list @nestjs/config
└─ @nestjs/config@9.0.0
1.2 多環境配置示例
/
├── .env # 基礎配置
├── .env.dev # 開發環境
├── .env.stage # 預發布環境
└── .env.prod # 生產環境
動態加載實現:
// app.module.ts
ConfigModule.forRoot({envFilePath: [`.env.${process.env.NODE_ENV}`, // 按環境加載'.env' // 默認配置],expandVariables: true // 支持變量嵌套
})
變量嵌套示例:
# .env
BASE_URL=/api/v1
USER_SERVICE=${BASE_URL}/users
二、模塊化配置實戰
2.1 根模塊高級配置
// app.module.ts
ConfigModule.forRoot({envFilePath: [`.env.${process.env.NODE_ENV}`, // 動態加載環境文件'.env' // 默認配置],isGlobal: true,cache: true, // 啟用配置緩存expandVariables: true // 支持變量擴展
});
2.2 數據庫模塊專用配置
// database.config.ts
export default registerAs('database', () => ({host: process.env.DB_HOST,port: parseInt(process.env.DB_PORT, 10) || 5432,ssl: process.env.NODE_ENV === 'production'
}));// database.module.ts
@Module({imports: [ConfigModule.forFeature(databaseConfig)]
})
export class DatabaseModule {}
三、配置獲取最佳實踐
3.1 類型安全獲取示例
// config.service.ts
getDatabaseConfig() {return {host: this.configService.get<string>('DB_HOST'),port: this.configService.get<number>('DB_PORT', 5432), // 帶默認值timeout: this.configService.getOrThrow<number>('API_TIMEOUT') // 強制存在};
}
3.2 枚舉工程化示例
// config.enum.ts
export enum ConfigKey {Database = 'database', // 對應注冊的命名空間Redis = 'redis'
}export enum DatabaseKey {Host = 'host',Port = 'port'
}// user.service.ts
const redisConfig = this.configService.get(ConfigKey.Redis);
const dbPort = this.configService.get(`${ConfigKey.Database}.${DatabaseKey.Port}`);
四、高級場景示例
4.1 動態配置熱更新
// 監聽配置變化
constructor(private configService: ConfigService) {configService.get('FEATURE_FLAG').subscribe(value => {this.updateFeatureFlags(value);});
}
4.2 多層級配置合并
# 支持YAML風格嵌套
DATABASE__HOST=cluster.db.example.com
DATABASE__OPTIONS__POOL_SIZE=10
DATABASE__OPTIONS__TIMEOUT=30
// 獲取嵌套配置
const poolSize = configService.get('database.options.poolSize');
五、實用配置技巧
5.1 配置智能提示
// app.config.ts
export default registerAs(ConfigNamespace.App, () => ({env: process.env.NODE_ENV,port: parseInt(process.env.PORT, 10) || 3000,enableSwagger: process.env.SWAGGER_ENABLED === 'true'
}));// 使用時獲得類型提示
this.configService.get(ConfigNamespace.App).enableSwagger
5.2 多層級配置合并
// 支持對象展開語法
const config = this.configService.get('database.connections.master');
六、項目結構建議
推薦配置目錄結構
src/
├─ config/
│ ├─ app.config.ts # 應用基礎配置
│ ├─ database.config.ts # 數據庫配置
│ ├─ auth.config.ts # 認證配置
│ └─ validate.ts # 校驗邏輯
├─ modules/
│ └─ ... # 業務模塊
分層配置示例
// auth.config.ts
export default registerAs('auth', () => ({secret: process.env.JWT_SECRET,expiresIn: process.env.JWT_EXPIRES_IN || '1h',refreshExpires: process.env.JWT_REFRESH_EXPIRES || '7d'
}));// app.config.ts
export default registerAs('app', () => ({env: process.env.NODE_ENV,port: parseInt(process.env.PORT, 10) || 3000
}));
七、調試技巧
7.1 配置查看命令
# 查看加載的配置
curl http://localhost:3000/config-print
7.2 熱重載配置(開發環境)
// main.ts
if (process.env.NODE_ENV === 'development') {const configService = app.get(ConfigService);fs.watch('.env', () => {configService.reload();console.log('配置文件已重新加載');});
}
八、安全實踐
8.1 敏感信息加密
// 使用crypto解密
import { createDecipheriv } from 'crypto';const decrypt = (text: string) => {const [iv, content] = text.split(':');const decipher = createDecipheriv('aes-256-ctr', ENCRYPT_KEY, Buffer.from(iv, 'hex'));return Buffer.concat([decipher.update(Buffer.from(content, 'hex')),decipher.final()]).toString();
};// 獲取加密配置
const dbPassword = decrypt(configService.get('DB_PASSWORD'));