NestJs中如何为指定Week数据对象创建对应响应DTO
NestJS 实现DTO约束周度时段接口返回方案
你目前已经完成了Service层逻辑和模拟数据准备,只需要补全DTO定义、控制器路由、端口配置三个部分就能跑通需求,具体操作如下:
1. 按数据嵌套层级定义响应DTO
你的数据是三层嵌套结构,需要分别定义每一层的DTO类,字段名必须和db.ts里的字段名完全一致,避免类型校验报错:
- 最内层:单个时段结构(对应First/Second/Third字段的内容)
新建src/dto/time-slot.dto.ts:export class TimeSlotDto { Start: number; end: number; isReserved: boolean; reserver: string; } - 中间层:单日时段组结构(对应TimeZone数组里的元素,包含First/Second/Third三个时段)
新建src/dto/day-timezone.dto.ts:import { TimeSlotDto } from './time-slot.dto'; export class DayTimezoneDto { First: TimeSlotDto; Second: TimeSlotDto; Third: TimeSlotDto; } - 最外层:周数据响应结构(就是你Service里已经引用的
WeekResponseDto)
新建src/dto/week-response.dto.ts:import { DayTimezoneDto } from './day-timezone.dto'; export class WeekResponseDto { DayName: string; TimeZone: DayTimezoneDto[]; }
提示:上面的写法可以满足TypeScript编译阶段的类型约束,如果需要运行时自动过滤非法字段、校验字段类型,只需要给DTO属性加上
class-validator对应的校验装饰器,再在全局开启ValidationPipe即可。
2. 编写控制器绑定根路由
打开src/app.controller.ts,注入已写好的AppService,添加GET方法映射到根路径:
import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; import { WeekResponseDto } from './dto/week-response.dto'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get() getWeekList(): WeekResponseDto[] { return this.appService.getWeek(); } }
3. 配置服务启动端口
打开src/main.ts,把监听端口改成8080,需要运行时DTO校验的话可以顺便开全局校验管道:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; // 开启运行时DTO校验需要引入 // import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 全局DTO校验/转换配置,按需开启 // app.useGlobalPipes(new ValidationPipe({ // transform: true, // 自动把返回/入参转换成DTO类实例 // whitelist: true, // 自动过滤DTO里没声明的多余字段 // })); await app.listen(8080); } bootstrap();
注意事项
- 记得在
app.service.ts顶部引入你定义的WeekResponseDto,不然TS会报找不到类型的错误 - DTO里的字段大小写要和模拟数据完全匹配,比如
DayName首字母大写、end全小写,写错会触发类型报错 - 启动前确认
AppModule里已经把AppController、AppService分别注册到controllers和providers数组中,同时db.ts里的Week数据已经正确导入到AppService里 - 启动成功后直接访问
http://localhost:8080就能拿到被DTO结构约束的周度时段数据
内容的提问来源于stack exchange,提问作者DarkSide77
相关产品推荐
相关产品推荐

