Skip to content

Nestjs 学习

使用环境变量


1️⃣ 安装依赖

NestJS 官方推荐使用 @nestjs/config 管理环境变量:

bash
npm install @nestjs/config

2️⃣ 创建 .env 文件

在项目根目录创建 .env

dotenv
SERVER_PORT=1918
SERVER_ADDRESS=127.0.0.1

注意:不要加空格,也不要加引号(除非值里面有空格)。


3️⃣ 配置 ConfigModule

app.module.ts 或核心模块里导入:

ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true, // 全局可用,不用每个模块都导入
    }),
    // 其他模块...
  ],
})
export class AppModule {}

4️⃣ 使用环境变量

方式 1:通过 ConfigService

ts
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class AppService {
  constructor(private configService: ConfigService) {}

  getServerInfo() {
    const port = this.configService.get<number>('SERVER_PORT');
    const address = this.configService.get<string>('SERVER_ADDRESS');
    return { port, address };
  }
}

方式 2:在 main.ts 启动服务器

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);

  const port = configService.get<number>('SERVER_PORT') || 3000;
  const address = configService.get<string>('SERVER_ADDRESS') || '0.0.0.0';

  await app.listen(port, address);
  console.log(`Server running at http://${address}:${port}`);
}
bootstrap();

5️⃣ 可选:类型校验(更安全)

可以用 class-validator 校验环境变量:

ts
import { IsInt, IsString } from 'class-validator';

export class EnvConfig {
  @IsInt()
  SERVER_PORT: number;

  @IsString()
  SERVER_ADDRESS: string;
}

ConfigModule.forRoot() 中加上 validationSchemavalidationOptions,防止配置错。


✅ 总结:

  1. 安装 @nestjs/config
  2. 创建 .env 文件
  3. ConfigModule.forRoot({ isGlobal: true })
  4. ConfigService.get('ENV_VAR_NAME') 使用

nestjs/mapped-types 作用

@nestjs/mapped-typesNestJS 官方提供的一个小工具库,主要用来 生成 DTO(数据传输对象)的衍生类型,让你不用手动重复写很多类似的类。


🔹作用

它提供了几个常用工具函数:

函数用途
PartialType()生成一个类的 所有属性都可选 的新类(常用于更新 DTO)
PickType()从原始类中 挑选指定属性 生成新类
OmitType()从原始类中 排除指定属性 生成新类
IntersectionType()组合多个类生成一个新类
ExcludeType()排除类型(较少用)

🔹使用示例

假设你有一个 CreateUserDto

ts
export class CreateUserDto {
  username: string;
  password: string;
  email: string;
}

1. 更新用户 DTO(属性可选)

ts
import { PartialType } from '@nestjs/mapped-types';

export class UpdateUserDto extends PartialType(CreateUserDto) {}

现在 UpdateUserDto 等价于:

ts
export class UpdateUserDto {
  username?: string;
  password?: string;
  email?: string;
}

就不用手动写一遍了,非常适合 REST API 的 PUT/PATCH 场景。


2. 挑选字段

ts
import { PickType } from '@nestjs/mapped-types';

export class UserEmailDto extends PickType(CreateUserDto, ['email'] as const) {}

生成的新类只有 email 属性。


3. 排除字段

ts
import { OmitType } from '@nestjs/mapped-types';

export class UserNoPasswordDto extends OmitType(CreateUserDto, ['password'] as const) {}

生成的新类没有 password 属性。


✅ 总结:

  • @nestjs/mapped-types 就是 帮你做类型映射的工具
  • 主要用途:减少重复写 DTO 类
  • 最常用PartialType(更新 DTO)

如果你需要,我可以帮你画一张 Create / Update / Pick / Omit DTO 类型映射图,让你一眼就看懂 NestJS DTO 的继承/映射关系。

你想让我画吗?