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

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.xdnf.cn/news/17501.html

相关文章:

  • 自动生成视频的AI大模型高效创作指南
  • Java Stream API 实战:提升集合处理的效率与可读性!
  • 微雪电子发布工业级ESP32-S3-POE工控板:8路隔离IO,双核240MHz赋能AIoT,一根网线解决供电与通信,工业物联网迎来高性价比控制新选择
  • 关键点检测(10)——yolov8-pose 复现coco-pose
  • 【QT】QMainWindow:打造专业级桌面应用的基石
  • Python基础教程(七)匹配模式:隐藏在结构之美中的编程革命
  • 实用Shell高级视频课程
  • 【CVPR2025】计算机视觉|PX:让模型训练“事半功倍”!
  • Uipath Studio中邮件自动化
  • 微信小程序中实现表单自动填充功能的方法
  • ABP VNext + Apache Kafka Exactly-Once 语义:金融级消息一致性实战
  • 在Docker中下载RabbitMQ(详细讲解参数)
  • 需求管理流程规范
  • Java-file类
  • Mybatis学习之自定义映射resultMap(七)
  • STM32CubeMX(十三)FatFs文件系统(SPI驱动W25Qxx)
  • BGP 笔记
  • 配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
  • .NET程序跨平台ARM电脑上发布的程序格式是,so还是DLL?
  • stm32项目(24)——基于STM32的汽车CAN通信系统
  • 费米问题:估算北京有多少量特斯拉汽车?
  • 等保测评-RabbitMQ中间件
  • 【线性代数】目录
  • day 16 stm32 IIC
  • STM32——时钟系统
  • WinForm 中 ListView 控件的实战应用与功能拓展
  • Bee 2.5.2.6 发布
  • 库函数蜂鸣器的使用(STC8)
  • Typora上传图片保存到assets目录下
  • 线程池多反应堆服务器webserver(c++)