书接上回,我们在class-validator发现了许多优秀的验证规则,但是在我们实际开发需求中,有很多地方需要验证,但是包缺少了,这个时候只能我们自己去写了,我们也是根据这个包的文档去实现自定义验证。
自定义验证类
这次我们以常见的注册模块中的两次密码验证为例带领大家来实现一下。
首先创建一个post请求用于表单提交的验证,并使用管道,管道在上一篇有提到过,相信看到这里的小伙伴都了解管道了,不多说,管道代码给大家贴出
import { ArgumentMetadata, BadRequestException, HttpException, HttpStatus, Injectable, PipeTransform } from '@nestjs/common';
import { plainToInstance } from 'class-transformer'
import { validate } from 'class-validator';
@Injectable()
export class MengPipe implements PipeTransform {
async transform(value: any, metadata: ArgumentMetadata) {
const object = plainToInstance(metadata.metatype, value)
const errors = await validate(object)
if (errors.length) {
const messages = errors.map(error => ({
name: error.property,
message: Object.values(error.constraints).map(v => v)
}))
throw new HttpException(messages, HttpStatus.BAD_REQUEST)
}
return value
}
}
接着在dto文件夹下面创建一个验证密码的文件,这两个都是class-validator给我们提供的可以直接用,上篇文章都有讲
接着在github找到这个地方
将代码复制下来后,接着创建一个rules文件夹存放自定义验证规则
我们在使用的时候其实就是向外暴露了validate这个函数,下面的defaultMessage是返回我们的报错信息的,所以结构还是比较简单的,具体可以看官方文档,很清晰。
我们对代码来简单调整一下
装饰器里面的用不到,先给他拿走, 来看看text以及args里面是啥东西
先把这个服务类在dto里面注册一下,让它明确我们要验证的是密码
这里返回的是错误不用管,因为我们validate返回的是fasle
text就是我们要验证的字段的数值
args可以拿到很多属性,这样我们就可以做验证了
当我们输入正确时可以成功返回,不正确时也能够捕捉错误
但是我们的写法有点low,来优化一下
这样,如果有很多需要验证的我们都可以用这一个验证类,达到复用的效果。
自定义验证装饰器
我们来用唯一字段验证这个例子带领大家掌握这个的用法
我们在rules下创建一个is_not_exist.ts文件
这个类型报错可以这样解决
把这个装饰器给引入一下
我们发现需要传入1~2个参数 property validationOptions ,也就是下面这里要传的参数
我们先在mysql中创建一条表数据
我们这里就以的添加表字段为例,实现一下验证装饰器的用法
我们以prisma实例来写一个查表的方法 这里要注意异步处理。
我们用的是是user这张表,所以传的property是'user'
当我们发起一个携带同样的username的post请求时 发现已经成功实现 ,正常请求也是没有问题
写在最后
nest有很多值得我们去探索的东西,我总结的都是在开发中大概率会用到的,希望能帮助到大家!