当前位置: 首页 > news >正文

NestJS Config 入门教程

什么是 NestJS Config?

NestJS Config 是官方提供的配置管理模块,基于 dotenv@nestjs/config 包实现,帮助开发者:

  1. 集中管理环境变量
  2. 支持多环境配置(开发/测试/生产)
  3. 类型安全地访问配置
  4. 验证配置有效性

快速开始

1. 安装依赖

npm install @nestjs/config dotenv

2. 创建配置文件

在项目根目录创建 .env 文件:

DATABASE_HOST=localhost
DATABASE_PORT=5432
JWT_SECRET=my_secure_secret

3. 基础配置

app.module.ts 中注册 ConfigModule:

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';@Module({imports: [ConfigModule.forRoot({isGlobal: true, // 全局可用envFilePath: '.env', // 指定环境文件路径}),],
})
export class AppModule {}

4. 访问配置

在服务中注入 ConfigService

import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';@Injectable()
export class DatabaseService {constructor(private configService: ConfigService) {}getConnection() {return {host: this.configService.get('DATABASE_HOST'),port: this.configService.get<number>('DATABASE_PORT'),};}
}

高级配置

1. 类型安全配置

创建 config.interface.ts

export interface DatabaseConfig {host: string;port: number;
}export interface AppConfig {jwtSecret: string;database: DatabaseConfig;
}

ConfigModule 中注册:

ConfigModule.forRoot({load: [() => ({jwtSecret: process.env.JWT_SECRET,database: {host: process.env.DATABASE_HOST,port: parseInt(process.env.DATABASE_PORT),},})],
});

2. 配置验证

使用 Joi 进行验证:

npm install joi

创建 validation.schema.ts

import * as Joi from 'joi';export const validationSchema = Joi.object({JWT_SECRET: Joi.string().required(),DATABASE_HOST: Joi.string().required(),DATABASE_PORT: Joi.number().required().default(5432),
});

ConfigModule 中应用:

ConfigModule.forRoot({validationSchema,validationOptions: {abortEarly: false, // 显示所有错误},
});

3. 多环境配置

创建不同环境的文件:

.env.development
.env.production
.env.test

通过 NODE_ENV 指定环境:

# 开发环境
NODE_ENV=development npm run start# 生产环境
NODE_ENV=production npm run start:prod

4. 嵌套配置

使用 registerAs 组织复杂配置:

// database.config.ts
export default registerAs('database', () => ({host: process.env.DATABASE_HOST,port: parseInt(process.env.DATABASE_PORT),
}));

在模块中导入:

ConfigModule.forRoot({load: [databaseConfig],
});

访问嵌套配置:

this.configService.get('database.host');

最佳实践

1. 安全第一

  • .gitignore 中添加 .env*
  • 生产环境使用秘密管理工具(AWS Secrets Manager、HashiCorp Vault)
  • 敏感变量使用加密存储

2. 变量命名规范

  • 全大写加下划线(如 STRIPE_API_KEY
  • 按功能分组(数据库、第三方服务、应用配置)

3. 类型安全

  • 始终为数字类型使用 parseIntparseFloat
  • 使用枚举类型处理有限选项
  • 为布尔值使用 process.env.VAR === 'true'

4. 默认值处理

this.configService.getOrThrow('REQUIRED_VAR');
this.configService.get('OPTIONAL_VAR', { infer: true }) ?? 'default';

5. Docker 集成

docker-compose.yml 中传递变量:

environment:- DATABASE_HOST=db-service- DATABASE_PORT=5432

常见问题

1. 变量未加载?

  1. 检查 .env 文件路径是否正确
  2. 确保 ConfigModule.forRoot() 在根模块注册
  3. 变量名是否包含特殊字符(建议仅用字母、数字、下划线)

2. 如何设置默认值?

this.configService.get('PORT', { infer: true }) ?? 3000;

3. 验证失败怎么办?

查看详细错误信息:

try {await ConfigModule.forRoot({validationSchema,});
} catch (e) {console.error('Config validation error:', e);process.exit(1);
}

示例项目结构

project-root/
├── src/
│   ├── config/
│   │   ├── database.config.ts
│   │   └── validation.schema.ts
│   └── app.module.ts
├── .env
├── .env.development
└── .env.production

替代方案

  • Node.js 原生方案(v20.6.0+):
    node --env-file=.env app.js
    
  • 秘密管理工具:Infisical、Doppler、AWS Secrets Manager

通过 NestJS Config,你可以构建出安全、可维护、环境感知的现代应用配置体系。立即开始,让你的配置管理告别混乱!

http://www.dtcms.com/a/322307.html

相关文章:

  • HUAWEI交换机命令基础
  • mfc按钮点击事件没有触发,且程序卡死
  • 服装工厂计件软件与外贸公司开发方案
  • 浏览器自动播放策略
  • 李宏毅深度学习教程 第16-18章 终身学习+网络压缩+可解释性人工智能
  • [CISCN 2021初赛]rsa
  • 建筑物实例分割数据集-9,700 张图片 城市规划与发展 灾害评估与应急响应 房地产市场分析 智慧城市管理 地理信息系统(GIS) 环境影响评估
  • 前端视角下关于 WebSocket 的简单理解
  • 华为实验-VLAN基础
  • Kafka学习记录
  • UE蓝图节点Add Impulse和Add Torque in Radians
  • 面向软件定义汽车的确定性以太网网络解决方案
  • ARMv8 MMU页表格式及地址转换过程分析
  • [CUDA] CUTLASS | C++ GEMM内核--高度模板化的类
  • 快速使用selenium+java案例
  • 系统开发 Day1
  • PyLS简介
  • NumPy性能飞跃秘籍:向量化计算如何提升400倍运算效率?
  • 【C++详解】AVL树深度剖析与模拟实现(单旋、双旋、平衡因⼦更新、平衡检测)
  • 云服务器--阿里云OSS(2)【Springboot使用阿里云OSS】
  • Datawhale AI夏令营-记录2
  • Kotlin初体验
  • 【linux基础】Linux 文本处理核心命令指南
  • 代码随想录day59图论9
  • NY151NY152美光固态闪存NY153NY154
  • 利用whisper api实现若无字幕则自动下载音频并用 whisper 转写,再用 LLM 总结。
  • JVM相关(AI回答)
  • 等保测评-RabbitMQ中间件
  • 【Java EE初阶 --- 网络原理】JVM
  • 从零玩转Linux云主机:免费申请、连接终端、命令速查表