环境变量配置

请先安装依赖

npm i --save @nestjs/config
npm install --save joi  // 用于验证

 

.env文件

# 数据库配置
DB_HOST=xxx
DB_PORT=3306
DB_USER=root
DB_PASS=xxx
DB_NAME=test

# 自定义变量
APP_PORT=3000
APP_NAME=MyNestApp
DATABASE_USER=test
DATABASE_PASSWORD=test

 

src/config/database.config.ts

import { registerAs } from '@nestjs/config';

export default registerAs('database', () => ({
  host: process.env.DB_HOST ?? 'localhost',
  port: process.env.DB_PORT ? parseInt(process.env.DB_PORT, 10) : 3306,
  user: process.env.DB_USER ?? 'root',
  pass: process.env.DB_PASS ?? '',
  name: process.env.DB_NAME ?? 'testdb',
}));

 

在app.module.ts里使用

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { Test1Module } from './test1/test1.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './user/user.module';
import { ConfigModule, ConfigService } from '@nestjs/config';
import * as Joi from 'joi';
import appConfig from './config/app.config';
import databaseConfig from './config/database.config';

interface DatabaseConfig {
  host: string;
  port: number;
  user: string;
  pass: string;
  name: string;
}

@Module({
  imports: [
    ConfigModule.forRoot({
      // 全局配置
      isGlobal: true,
      // 忽略 .env 文件
      // ignoreEnvFile: true,
      // 指定环境文件
      // envFilePath: '.development.env',
      load: [appConfig, databaseConfig],
      validationSchema: Joi.object({
        APP_PORT: Joi.number().default(3000),
        DB_HOST: Joi.string().required(),
        DB_PORT: Joi.number().default(3306),
        DB_USER: Joi.string().required(),
        DB_PASS: Joi.string().allow(''),
        DB_NAME: Joi.string().required(),
      }),
    }),
    Test1Module,
    // TypeORM 数据库连接
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => {
        const dbConfig = configService.get<DatabaseConfig>('database')!;
        return {
          type: 'mysql',
          host: dbConfig.host,
          port: dbConfig.port,
          username: dbConfig.user,
          password: dbConfig.pass,
          database: dbConfig.name,
          entities: [],
          synchronize: true, // 开发模式自动建表
          autoLoadEntities: true, // 自动加载实体
        };
      },
    }),
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

 

在普通service中使用

// src/user/user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './entities/user.entity';
import { CreateUserDto } from './dto/create-user.dto';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private userRepo: Repository<User>,
    private configService: ConfigService, // 注入 ConfigService
  ) {}

  async create(createUserDto: CreateUserDto): Promise<User> {
    const user = this.userRepo.create(createUserDto);
    return this.userRepo.save(user);
  }

  async findAll(
    page = 1,
    limit = 10,
  ): Promise<{ data: User[]; total: number; page: number; limit: number }> {
    const port = this.configService.get<number>('app.port') || 3001;
    console.log(port);

    const [data, total] = await this.userRepo.findAndCount({
      skip: (page - 1) * limit,
      take: limit,
      order: { id: 'ASC' },
    });

    return { data, total, page, limit };
  }
}

 

posted on 2025-08-08 15:45  sss大辉  阅读(24)  评论(0)    收藏  举报

导航