news 2026/6/23 20:59:45

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

作者头像

张小明

前端开发工程师

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

第二阶段目标

我们把:

POST /books

改造成:

请求:

{ "name":"NestJS实战", "author":"Tom" }

通过校验:

返回:

{ "id":1, "name":"NestJS实战", "author":"Tom" }

错误:

{ "message":[ "name不能为空", "author必须是字符串" ] }

第一步:安装校验依赖

Nest 使用:

  • class-validator
  • class-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

正确请求

POST

http://localhost:3000/books

Body:

{ "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 企业开发每天都会用的东西。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 20:49:59

如何设计一个支持“撤销-重做”(Undo-Redo)的功能?

如何设计一个支持“撤销/重做”的功能? 在现代软件应用中,“撤销/重做”功能几乎是用户操作的标配。无论是文本编辑、图形设计还是代码编写,用户都希望能够在操作失误时轻松回退,或在需要时恢复之前的操作。那么,如何…

作者头像 李华
网站建设 2026/6/23 20:39:30

灾难恢复方案数据恢复与业务连续性

灾难恢复方案:数据恢复与业务连续性的关键保障 在数字化时代,数据已成为企业最核心的资产之一。自然灾害、网络攻击或人为失误等突发事件可能导致数据丢失或业务中断,给企业带来巨大损失。灾难恢复方案的核心目标正是确保数据快速恢复与业务…

作者头像 李华
网站建设 2026/6/23 20:33:32

5分钟复活经典游戏联机:IPXWrapper终极解决方案

5分钟复活经典游戏联机:IPXWrapper终极解决方案 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 还在为《红色警戒2》、《暗黑破坏神》等经典游戏无法在Windows 10/11上联机而苦恼吗?IPXWrapper正是你需要…

作者头像 李华
网站建设 2026/6/23 20:31:42

AVR TCD定时器输入模式与Dithering技术:高精度测量与PWM控制

1. 从“定时器”到“精密测量”:为什么我们需要TCD的输入模式?在嵌入式开发里,定时器(Timer)是再基础不过的模块了。我们用它来产生精确的延时,生成PWM波驱动电机或LED,或者简单地计数外部脉冲。…

作者头像 李华
网站建设 2026/6/23 20:21:28

3分钟解锁百度文库知识宝库:开源工具让你零成本获取付费文档

3分钟解锁百度文库知识宝库:开源工具让你零成本获取付费文档 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 你是否曾在百度文库找到一份急需的工作报告或学习资料,却被下载…

作者头像 李华
网站建设 2026/6/23 20:18:28

如何在Web应用中实现无插件二维码扫描:Html5-QRCode实战指南

如何在Web应用中实现无插件二维码扫描:Html5-QRCode实战指南 【免费下载链接】html5-qrcode A cross platform HTML5 QR code reader. See end to end implementation at: https://scanapp.org 项目地址: https://gitcode.com/gh_mirrors/ht/html5-qrcode 你…

作者头像 李华