Nestjs 学习
使用环境变量
1️⃣ 安装依赖
NestJS 官方推荐使用 @nestjs/config 管理环境变量:
bash
npm install @nestjs/config2️⃣ 创建 .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() 中加上 validationSchema 或 validationOptions,防止配置错。
✅ 总结:
- 安装
@nestjs/config - 创建
.env文件 ConfigModule.forRoot({ isGlobal: true })ConfigService.get('ENV_VAR_NAME')使用
nestjs/mapped-types 作用
@nestjs/mapped-types 是 NestJS 官方提供的一个小工具库,主要用来 生成 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) {}生成的新类只有
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 的继承/映射关系。
你想让我画吗?