NestJS 集成环境变量
集成过程
- 安装
shell
pnpm install @nestjs/config joi- 创建环境文件
shell
# .env.development(开发环境)
PORT=3000
NODE_ENV='development'
DATABASE_URL=mysql://root:123456@localhost:3306/nest_db
JWT_SECRET=my-secret-key
JWT_EXPIRES_IN=1h
# .env.production(生产环境)
PORT=3001
NODE_ENV='production'
DATABASE_URL=mysql://root:123456@localhost:3306/nest_db
JWT_SECRET=my-secret-key
JWT_EXPIRES_IN=1h
# .env.test
PORT=2999
NODE_ENV='test'
DATABASE_URL=mysql://root:123456@localhost:3306/nest_db
JWT_SECRET=my-secret-key
JWT_EXPIRES_IN=1h- 核心配置&参数校验
ts
// src/app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import * as Joi from 'joi';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, // 全局模块,无需在其他模块重复导入
envFilePath: `.env.${process.env.NODE_ENV || 'development'}`,
cache: true, // 缓存环境变量,提升性能
// 校验规则
validationSchema: Joi.object({
NODE_ENV: Joi.string()
.valid('development', 'test', 'production')
.default('development'),
PORT: Joi.number().default(3000),
DATABASE_URL: Joi.string().required(), // 必传
JWT_SECRET: Joi.string().required(),
JWT_EXPIRES_IN: Joi.string().default('1h'),
}),
// 校验失败时是否抛出错误(默认 true)
validationOptions: {
abortEarly: false, // 显示所有校验错误(而非第一个)
},
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}- 在 src/app.service.ts 中使用环境变量
ts
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
@Injectable()
export class AppService {
constructor(private configService: ConfigService) {}
getHello(): any {
const port = this.configService.get('PORT');
const jwtSecret = this.configService.get('JWT_SECRET');
return {
port,
jwtSecret,
nodeEnv: this.configService.get('NODE_ENV'),
};
}
}- 在 src/main.ts 中使用环境变量
ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();测试
shell
# 开发环境测试
npm run start:dev # 浏览器访问 http://localhost:3000/
# 生产环境测试
npm run start:prod # 浏览器访问 http://localhost:3001/
# 生产环境测试
npm run start:prod # 浏览器访问 http://localhost:2999/