视频教程
25_nestjs中对post参数进行验证_哔哩哔哩_bilibili
1. 介绍
在Nest.js中,ValidationPipe 是一个内置的管道,它主要用于对控制器层接收到的HTTP请求参数进行验证。ValidationPipe 结合了 class-validator 库的功能,允许开发人员通过在 DTO(Data Transfer Object)类中使用装饰器来声明性地定义各种验证规则。
我们上节课,讲的都是对get请求的参数验证,那我们的post请求参数应该如何验证?
nest new validation-pipe -p pnpm
2. post参数验证
之前我们讲过, post 请求的数据通过 @Body 装饰器获取,并且要有一个 dto 来接收
nest g res user --no-spec
修改下CreateUserDto
打印一下参数
我们用apifox发送一个post请求
可以看到,我们传递的参数就被正常的打印出来了,这是正常的情况,那我们来验证下参数有问题的情况
我们期望的age是个整数,这里是个字符串,那么应该报错,对吧。所以这个时候我们就需要对参数进行校验,那么我们要怎么校验?答案是使用ValidationPipe
使用它还需要安装两个其他包
pnpm install class-validator class-transformer
然后我们加上验证
还需要在CreateUserDto里面,用 class-validator 包的 @IsInt 装饰器标记一下
再次发生请求
3. 自定义错误信息
message除了是字符串,还可以是函数
可以拿到对象、属性名、属性值、class 名等信息,我们可以根据这些字段定制错误信息
4. 常用验证
装饰器名称 | 中文意思 | 使用情况 |
---|---|---|
@IsNotEmpty() | 非空 | 检查给定值是否不为空(!== '', !== null, !== undefined) |
@IsString() | 字符串 | 检查值是否为字符串 |
@IsNumber() | 数字 | 检查值是否为数字 |
@IsBoolean() | 布尔 | 检查值是否为布尔类型 |
@IsDate() | 日期 | 检查值是否为日期对象 |
@IsArray() | 数组 | 检查值是否为数组 |
@IsEnum() | 枚举 | 检查值是否为枚举类型 |
@IsInt() | 整数 | 检查值是否为整数 |
@IsPositive() | 正数 | 检查值是否为正数 |
@IsNegative() | 负数 | 检查值是否为负数 |
@Min() | 最小值 | 检查数值是否大于等于给定数值 |
@Max() | 最大值 | 检查数值是否小于等于给定数值 |
@Length() | 长度 | 检查字符串长度是否在某个范围内 |
@MinLength() | 最小长度 | 检查字符串长度是否不少于给定数字 |
@MaxLength() | 最大长度 | 检查字符串长度是否不超过给定数字 |
@IsEmail() | 电子邮件 | 检查值是否为电子邮件地址 |
@IsUrl() | URL地址 | 检查值是否为URL地址 |
@Matches() | 匹配 | 检查字符串是否匹配指定的正则表达式 |
@IsBooleanString() | 布尔字符串 | 检查值是否为布尔字符串(例如 "true" 或 "false" 或 "1", "0") |
@IsNumberString() | 数字字符串 | 检查字符串是否为数字 |
@IsBase64() | Base64字符串 | 检查值是否为Base64字符串 |
@IsMongoId() | MongoDB ObjectId | 检查字符串是否为MongoDB的ObjectId字符串 |
@IsPostalCode() | 邮政编码 | 检查值是否为邮政编码 |
@IsHexColor() | 十六进制颜色码 | 检查值是否为十六进制颜色码 |
@IsAlpha() | 纯字母 | 检查字符串是否只包含字母 (a-zA-Z) |
@IsAlphanumeric() | 字母数字 | 检查字符串是否只包含字母和数字 |
@IsAscii() | ASCII字符 | 检查字符串是否只包含ASCII字符 |
@IsFullWidth() | 全角字符 | 检查字符串是否包含任何全角字符 |
@IsIn() | 包含于数组 | 检查值是否在允许值的数组中 |