nest自定义验证类及自定义验证装饰器

简介: nest自定义验证类及自定义验证装饰器

书接上回,我们在class-validator发现了许多优秀的验证规则,但是在我们实际开发需求中,有很多地方需要验证,但是包缺少了,这个时候只能我们自己去写了,我们也是根据这个包的文档去实现自定义验证。


image.png


自定义验证类

这次我们以常见的注册模块中的两次密码验证为例带领大家来实现一下。


首先创建一个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给我们提供的可以直接用,上篇文章都有讲

image.png

接着在github找到这个地方


image.png    

image.png


将代码复制下来后,接着创建一个rules文件夹存放自定义验证规则


image.png


我们在使用的时候其实就是向外暴露了validate这个函数,下面的defaultMessage是返回我们的报错信息的,所以结构还是比较简单的,具体可以看官方文档,很清晰。


我们对代码来简单调整一下


装饰器里面的用不到,先给他拿走, 来看看text以及args里面是啥东西

image.png

先把这个服务类在dto里面注册一下,让它明确我们要验证的是密码

image.png

image.png

image.png


image.png


这里返回的是错误不用管,因为我们validate返回的是fasle


text就是我们要验证的字段的数值


args可以拿到很多属性,这样我们就可以做验证了

image.png


image.png

image.png


 当我们输入正确时可以成功返回,不正确时也能够捕捉错误


但是我们的写法有点low,来优化一下


image.png


这样,如果有很多需要验证的我们都可以用这一个验证类,达到复用的效果。


自定义验证装饰器

我们来用唯一字段验证这个例子带领大家掌握这个的用法


image.png


我们在rules下创建一个is_not_exist.ts文件


image.png


这个类型报错可以这样解决

image.png

把这个装饰器给引入一下


image.png


我们发现需要传入1~2个参数 property validationOptions ,也就是下面这里要传的参数


image.png


我们先在mysql中创建一条表数据


image.png


我们这里就以的添加表字段为例,实现一下验证装饰器的用法


我们以prisma实例来写一个查表的方法 这里要注意异步处理。


image.png


我们用的是是user这张表,所以传的property是'user'


当我们发起一个携带同样的username的post请求时 发现已经成功实现  ,正常请求也是没有问题


image.png


image.png


写在最后    

nest有很多值得我们去探索的东西,我总结的都是在开发中大概率会用到的,希望能帮助到大家!

相关文章
|
2天前
|
JavaScript 前端开发 算法
< 封装公共导出模块:配合element实现提示 >
在 Vue + elementUi 开发中,我们偶尔会遇到需要导出的列表,或者指定位置的导出内容。在一个项目里面是十分常见的,但是由于导出代码有稍微有点长,不方便维护!基于项目开发需求,封装了一个公用的导出模块,模块入口提供了 四个参数,分别是:导出接口地址导出参数对象导出文件名称导出时选择的服务地址(需要配合config文件实现选择功能)。且基于信息安全问题,实现信息提示,当提示点击遵守规则才允许下载文件!
< 封装公共导出模块:配合element实现提示 >
|
6月前
|
数据安全/隐私保护
fastadmin中写接口是时Validate规则验证自定义如何用
fastadmin中写接口是时Validate规则验证自定义如何用
|
3月前
|
存储 API
功能定义
功能定义.
53 1
功能定义
|
10月前
index.js:39 错误:修饰类属性失败。请确保提案类属性已启用并设置为使用松散模式。要在规范模式下将提案类属性与修饰器一起使用,请在阶段 2 中等待下一个主要版本的装饰器。 #79
index.js:39 错误:修饰类属性失败。请确保提案类属性已启用并设置为使用松散模式。要在规范模式下将提案类属性与修饰器一起使用,请在阶段 2 中等待下一个主要版本的装饰器。 #79
52 0
|
10月前
修饰类属性失败。请确保提案类属性已启用并设置为使用松散模式。要在规范模式下将提案类属性与修饰器一起使用,请在阶段 2 中等待下一个主要版本的装饰器。 #80
修饰类属性失败。请确保提案类属性已启用并设置为使用松散模式。要在规范模式下将提案类属性与修饰器一起使用,请在阶段 2 中等待下一个主要版本的装饰器。 #80
32 0
|
11月前
|
网络安全 Windows
基于fastapi实现6个接口(token拦截, 2个业务流程,接口参数依赖校验)已经通过postman测试,记录部署服务器和windows,用于pytest接口自动化框架的接口测试对象
基于fastapi实现6个接口(token拦截, 2个业务流程,接口参数依赖校验)已经通过postman测试,记录部署服务器和windows,用于pytest接口自动化框架的接口测试对象
接口参数注解验证案例
写作缘由 写接口的时候经常会有请求体里某字段不为null的需求;也有使用一个dto对象,但是插入和修改都想使用这个dto,那这样的话判断条件就不一样,因为修改操作必须有ID,所以参数验证还是挺麻烦的。所以写个demo记录一下,亲测可用。
117 0
|
jenkins 测试技术 持续交付
python接口自动化(三十五)-封装与调用--流程类接口关联(详解)
流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便。在这里我们还是以博客园为例,带着小伙伴们实践一下。
345 0
python接口自动化(三十五)-封装与调用--流程类接口关联(详解)
|
jenkins 测试技术 持续交付
python接口自动化(三十六)-封装与调用--流程类接口关联续集(详解)
上一篇已经给大家都介绍过了流程类接口关联,但是由于博客的登录机制改变,所以没有办法给小伙伴们实战演练一下,那么这篇就按照上一篇计划的用jenkins来给小伙伴们演示一下流程类接口的封装和调用,其实很简单,就是用上一篇和前边这篇传送门的代码稍稍修改即可。不知道你自己练习了么,如果练习了,可以看看和我有什么不同,没练习的看看自己思路和我有啥不一样。好了废话少说进入主题
177 0
python接口自动化(三十六)-封装与调用--流程类接口关联续集(详解)