spring的技术笔记
学习Nest核心第 11 / 23 篇1 分钟阅读

DTO 校验与管道

DTO 校验与管道

这节要解决什么

学会用 DTO + ValidationPipe 拦住「乱七八糟的请求体」,避免脏数据进数据库。

先用大白话

前端表单会做校验;后端也必须再做一次 —— 永远别相信客户端。

  • DTO(Data Transfer Object):描述「这个接口允许哪些字段、类型是什么」的类
  • Pipe:数据进入 Controller 之前的加工/校验器
  • ValidationPipe:最常用,配合 class-validator 装饰器

类比:Element Plus / 表单 rules,只不过写在后端 TypeScript 类上。

export class CreateBookmarkDto {
  @IsString()
  @MinLength(1)
  title: string
 
  @IsUrl()
  url: string
}

请求体缺字段或 URL 不合法 → 直接 400,进不了 Service。

对着项目看

主项目中常见位置:

  • src/bookmarks/dto/create-bookmark.dto.ts
  • src/bookmarks/dto/update-bookmark.dto.ts
  • src/auth/dto/register.dto.ts / login.dto.ts
  • src/main.ts 里的 app.useGlobalPipes(new ValidationPipe(...))

建议全局打开:

  • whitelist: true:DTO 没声明的字段直接剥掉(防乱传)
  • transform: true:自动做点类型转换

动手试

故意发一个坏请求:

curl -X POST http://localhost:3000/bookmarks \
  -H 'Content-Type: application/json' \
  -d '{"title":""}'

应看到校验错误,而不是进数据库。

验收清单

  • 知道 DTO 是「接口的合同」
  • 知道 ValidationPipe 在 Controller 前生效
  • 会读懂一个带 @IsString() 的 DTO 文件

下一节 → 04-异常过滤器与统一响应.md