Skip to content

NestJS 集成环境变量

集成过程

  1. 安装
shell
pnpm install @nestjs/config joi
  1. 创建环境文件
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
  1. 核心配置&参数校验
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 {}
  1. 在 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'),
    };
  }
}
  1. 在 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/