nestjs配置@nestjs/config 入门教程
1. 安装与基础配置
1.1 安装依赖
npm install @nestjs/config
1.2 根模块配置
在 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 {}
2. 创建 .env
文件
在项目根目录创建 .env
文件,定义环境变量:
DATABASE_HOST=localhost
DATABASE_PORT=5432
JWT_SECRET=my_secure_secret
3. 访问配置
3.1 注入 ConfigService
在服务或控制器中注入 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'),};}
}
4. 类型安全配置
4.1 定义配置接口
创建 config.interface.ts
定义配置结构:
export interface DatabaseConfig {host: string;port: number;
}export interface AppConfig {jwtSecret: string;database: DatabaseConfig;
}
4.2 加载配置
在 ConfigModule
中加载配置:
ConfigModule.forRoot({load: [() => ({jwtSecret: process.env.JWT_SECRET,database: {host: process.env.DATABASE_HOST,port: parseInt(process.env.DATABASE_PORT),},})],
});
5. 配置验证
5.1 安装 Joi
npm install joi
5.2 定义验证模式
创建 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),
});
5.3 应用验证
在 ConfigModule
中启用验证:
ConfigModule.forRoot({validationSchema,validationOptions: {abortEarly: false, // 显示所有错误},
});
6. 多环境配置
6.1 创建环境文件
.env.development
.env.production
.env.test
6.2 动态加载环境文件
ConfigModule.forRoot({envFilePath: `.env.${process.env.NODE_ENV || 'development'}`,
});
6.3 指定环境启动
在 package.json
中配置脚本:
"scripts": {"start:dev": "cross-env NODE_ENV=development nest start --watch","start:prod": "cross-env NODE_ENV=production node dist/main"
}
7. 嵌套配置与命名空间
7.1 使用 registerAs
创建 database.config.ts
:
import { registerAs } from '@nestjs/config';export default registerAs('database', () => ({host: process.env.DATABASE_HOST,port: parseInt(process.env.DATABASE_PORT),
}));
7.2 加载并访问嵌套配置
ConfigModule.forRoot({load: [databaseConfig],
});// 在服务中访问
this.configService.get('database.host');
8. 最佳实践
8.1 安全建议
- 将
.env
文件加入.gitignore
。 - 生产环境使用秘密管理工具(如 AWS Secrets Manager)。
8.2 变量命名
- 全大写加下划线(如
STRIPE_API_KEY
)。 - 按功能分组(数据库、第三方服务等)。
8.3 类型安全
- 数字类型使用
parseInt
或parseFloat
。 - 布尔值使用
process.env.VAR === 'true'
。
8.4 默认值处理
this.configService.getOrThrow('REQUIRED_VAR');
this.configService.get('OPTIONAL_VAR', { infer: true }) ?? 'default';
9. 完整示例
9.1 项目结构
├── src
│ ├── config
│ │ ├── database.config.ts
│ │ └── validation.schema.ts
│ ├── app.module.ts
│ └── main.ts
├── .env
├── .env.development
└── .env.production
9.2 main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ConfigService } from '@nestjs/config';async function bootstrap() {const app = await NestFactory.create(AppModule);const configService = app.get(ConfigService);console.log(`Application running on port ${configService.get('PORT')}`);await app.listen(configService.get('PORT') || 3000);
}
bootstrap();
通过以上步骤,您可以系统地管理和配置 NestJS 应用程序的环境变量,确保代码的健壮性和可维护性。