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.tssrc/bookmarks/dto/update-bookmark.dto.tssrc/auth/dto/register.dto.ts/login.dto.tssrc/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