用 NestJS 从零开发一个完整的小项目:图书管理系统(第二阶段:DTO + 参数校验 + 数据转换)

📅 2026/6/23 20:59:54
用 NestJS 从零开发一个完整的小项目:图书管理系统(第二阶段:DTO + 参数校验 + 数据转换)
第二阶段目标我们把POST /books改造成请求{ name:NestJS实战, author:Tom }通过校验返回{ id:1, name:NestJS实战, author:Tom }错误{ message:[ name不能为空, author必须是字符串 ] }第一步安装校验依赖Nest 使用class-validatorclass-transformer安装pnpm add class-validator class-transformer作用包作用class-validator定义规则class-transformer类型转换第二步修改 CreateBookDto找到src/books/dto/create-book.dto.ts现在export class CreateBookDto {}改成import { IsString, IsNotEmpty } from class-validator; export class CreateBookDto { IsString() IsNotEmpty() name:string; IsString() IsNotEmpty() author:string; }解释例如{ name:NestJS }通过IsString()检查name是不是字符串第三步开启全局验证打开main.ts原来async function bootstrap() { const app await NestFactory.create(AppModule); await app.listen(3000); }修改import { ValidationPipe } from nestjs/common; async function bootstrap() { const app await NestFactory.create(AppModule); app.useGlobalPipes( new ValidationPipe() ); await app.listen(3000); }现在所有 Controller 的Body()都会自动验证。第四步测试新增重新启动pnpm run start:dev正确请求POSThttp://localhost:3000/booksBody{ name:NestJS, author:Tom }成功。错误测试发送{ name:, author:123 }返回{ message:[ name should not be empty, name must be a string, author must be a string ], error:Bad Request, statusCode:400 }说明校验生效。第五步理解执行流程现在请求POST /books进入BooksController↓这里create( Body() createBookDto:CreateBookDto )↓Nest先执行ValidationPipe↓检查CreateBookDto规则↓通过进入BooksService流程请求 ↓ Pipe ↓ Controller ↓ Service ↓ 返回第六步UpdateDto 为什么能部分更新你之前看到UpdateBookDto打开update-book.dto.ts应该类似import { PartialType } from nestjs/mapped-types; import { CreateBookDto } from ./create-book.dto; export class UpdateBookDto extends PartialType(CreateBookDto){}重点PartialType()作用把class CreateBookDto{ name:string; author:string; }变成class UpdateBookDto{ name?:string; author?:string; }也就是创建{ name:NestJS, author:Tom }必须全部传。更新{ name:新版NestJS }可以只传部分。到这里你掌握DTO ↓ class-validator ↓ ValidationPipe ↓ 数据校验 ↓ PartialType这是 Nest 企业开发每天都会用的东西。