You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:27:18