首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

javascript/typescript | class-validator |自定义验证修饰符|重写`validator`方法中的`validationOptions`

基础概念

class-validator 是一个用于 TypeScript 的库,它允许你在类属性上添加验证装饰器,以便在运行时检查这些属性的有效性。这对于构建健壮的 API 和确保数据完整性非常有用。

自定义验证修饰符允许你创建自己的验证逻辑,以满足特定的业务需求。通过重写 validator 方法中的 validationOptions,你可以进一步定制验证行为。

相关优势

  1. 类型安全:由于 class-validator 与 TypeScript 紧密集成,它可以在编译时捕获许多类型错误。
  2. 可重用性:自定义验证修饰符可以在多个类中重复使用,提高了代码的可维护性和可重用性。
  3. 灵活性:通过重写 validator 方法中的 validationOptions,你可以实现高度定制化的验证逻辑。

类型

class-validator 提供了多种内置验证装饰器,如 @IsString@IsInt@IsEmail 等。此外,你还可以创建自定义验证装饰器。

应用场景

  1. API 输入验证:在处理 HTTP 请求时,验证传入的数据是否符合预期格式。
  2. 数据持久化:在将数据保存到数据库之前,确保数据的有效性。
  3. 业务逻辑验证:在执行特定业务逻辑之前,验证输入参数是否满足条件。

示例代码

假设我们需要创建一个自定义验证修饰符,用于检查字符串是否包含特定子字符串:

代码语言:txt
复制
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

export function ContainsSubstring(substring: string, validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'containsSubstring',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments): boolean {
          if (typeof value !== 'string') {
            return false;
          }
          return value.includes(substring);
        },
      },
    });
  };
}

然后,我们可以在类属性上使用这个自定义验证修饰符:

代码语言:txt
复制
import { IsString } from 'class-validator';
import { ContainsSubstring } from './contains-substring.decorator';

class User {
  @IsString()
  @ContainsSubstring('admin')
  username: string;
}

参考链接

解决常见问题

如果你在使用 class-validator 时遇到问题,例如自定义验证修饰符不起作用,可以检查以下几点:

  1. 确保装饰器正确注册:检查自定义装饰器是否正确注册到 registerDecorator 中。
  2. 验证顺序:确保在类属性上正确应用了所有装饰器,并且顺序正确。
  3. 错误处理:确保在验证失败时正确处理错误,并返回适当的错误信息。

通过这些步骤,你应该能够解决大多数与 class-validator 相关的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

实现nest的自定义注解

前言 Nest 与 class-validator[1] 配合得很好,它允许我们使用基于装饰器的验证,在dto层中我们可以通过它的一些内置注解完成对参数的一些常用校验。...我们在阅读class-validator仓库文档的custom-validation-decorators[3]章节后,大概了解了它的流程,接下来我们来实践它。...我们通过registerDecorator方法来注册一个装饰器,代码如下所示: IsConfig 为注解的名称,它是函数类型,接受一个ValidationOptions类型的可选参数 装饰器注册函数中有一个...validator属性,用于校验数据,将在下个章节进行详细讲解 // 配置验证注解 export function IsConfig(validationOptions?...,它的作用就是为了其能像内置注解一样,修改其公开属性,例如message,我们可以对验证失败时的错误信息进行自定义。

69420

Nest.js 实战系列四:使用管道、DTO 验证入参,摆脱 if-else 的恐惧

使用 DTO 可以清晰的了解对象的结构,使用 Pipes(管道)配合 class-validator 还可以对参数类型进行判断,还可以在验证失败的时候抛出错误信息。...: string | number; } 上面简单编写了一些常用的验证手段,class-validator 里面有非常多的验证方法,有兴趣的读者可以访问官方文档去学习:GitHub: class-validator...上图可以看到 accountName 的 @IsNotEmpty() 已经生效了 注意:class-validator 还提供了一个方法叫 @IsEmpty(),这是表示参数必须为空,不要搞混了。...总结 本篇介绍了如何定义 DTO,如何使用 Pipes 管道,以及如何配合 class-validator 进行入参验证。...但如果不拥抱 TypeScript 的特性,那还不如直接用 JavaScript 来写,这样还更快(如 Koa、Egg等),定义 DTO 还有一个好处,那就是可以配合 Swagger 自动生成文档,并且是可请求的

4K20
  • Nest.js 从零到壹系列(五):使用管道、DTO 验证入参,摆脱 if-else 的恐惧

    使用 DTO 可以清晰的了解对象的结构,使用 Pipes(管道)配合 class-validator 还可以对参数类型进行判断,还可以在验证失败的时候抛出错误信息。...: string | number; } 上面简单编写了一些常用的验证手段,class-validator 里面有非常多的验证方法,有兴趣的读者可以访问官方文档去学习:GitHub: class-validator...上图可以看到 accountName 的 @IsNotEmpty() 已经生效了 注意:class-validator 还提供了一个方法叫 @IsEmpty(),这是表示参数必须为空,不要搞混了。...总结 本篇介绍了如何定义 DTO,如何使用 Pipes 管道,以及如何配合 class-validator 进行入参验证。...但如果不拥抱 TypeScript 的特性,那还不如直接用 JavaScript 来写,这样还更快(如 Koa、Egg等),定义 DTO 还有一个好处,那就是可以配合 Swagger 自动生成文档,并且是可请求的

    4.1K41

    class-validator的使用

    在使用nestjs开发应用时,我们一般需要对前端提交的数据进行验证,此时就需要用到class-validator这个库了。...console.log('验证失败:', errors); } else { console.log('验证通过'); }});1、首先导入了class-validator包中的一些常用装饰器...4、用validate方法验证上一步的对象,validate会根据对象找到生成此对象的类,然后根据类属性修饰符,对对象的相应属性进行验证,并输出结果。...到此为止,我们了解了class-validator的基本使用。但是这里我们产生了一个疑问?...此时我们需要将字面量对象转化为类对象,并且是class-validator中的修饰符修饰过的类的对象,怎么办呢?此时我们需要另外一个库class-transformer。

    33810

    nestjs中如何使用class-validator和class-transformer

    管道验证操作通常用在dto这种传输层的文件中,用作验证操作。首先我们安装两个需要的依赖包:class-transformer和class-validator。...npm install class-validator class-transformer -S然后在xxxx.dto.ts文件中添加验证, 完善错误信息提示:import { IsNotEmpty,...将得到的这个 dto 实例通过 class-validator 包的 validate 函数进行验证,validate 函数同时会对 dto 实例进行相应处理(比如,设置了 whitelist, 会删除没有被...方法收到相应参数 当然了,这是nestjs借助了ValidationPipe使用class-validator和calss-transformer,我们也可以自定义pipe来使用这两个包。...以上便是nestjs中如何使用class-validator和class-transformer,希望对你有所帮助。

    1.1K10

    Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换

    在 Nest.js 中,管道(Pipelines) 是一种强大的功能,用于预处理进入控制器方法的请求数据,如请求体、查询参数、路径参数等。...例如,使用 ValidationPipe 结合 class-validator,可以自动验证请求体或查询参数是否满足特定的 DTO(数据传输对象)定义,从而预防因数据格式错误引起的运行时异常错误处理:如果数据不符合管道的规则...,管道可以抛出异常,从而阻止请求的进一步处理,并向客户端返回适当的错误信息一致性:管道有助于在整个应用中保持一致性,避免在不同的控制器或方法中重复相同的预处理逻辑可插拔性和重用性:管道是可插拔的组件,可以很容易地在多个控制器或方法之间共享和重用内置管道...它使用 class-validator 库来检查数据是否符合定义在 DTOs 或请求模型上的验证规则ParseIntPipe:将字符串类型的参数转换为整数ParseFloatPipe:将字符串类型的参数转换为浮点数...、大小等,确保上传的文件符合预期自定义管道 1、 安装依赖 pnpm add class-validator class-transformer 2、 新建 /pipe/validation.pipe.ts

    20510

    快速打开 Nestjs 的世界

    它使用渐进式JavaScript,使用TypeScript构建并完全支持TypeScript(但仍然允许开发人员使用纯JavaScript编码),并结合了OOP(面向对象编程)、FP(功能编程)和FRP...,通过重写catch()实现具体的拦截处理。...catch()方法的参数中,exception参数是当前正在处理的异常对象。...; metatype:提供参数的元类型; 基于对象模式验证 下面是创建新 Cat 数据的create处理函数,在穿如若服务层之前仍然缺少验证 cat 数据完整且有效步骤,在遵守单一责任原则就可以通过自定义验证管道的方法做来...同样还是先来执行命令npm i --save class-validator class-transformer安装必要的模块后将 Cat 接口改为 Cat 类: export class Cat {

    55710

    NestJs 管道(Pipe)

    管道(Pipe)的作用 管道(Pipe)作用在每个控制器的处理方法上,也就是当每一个请求被路由到具体的控制器的方法后会先通过管道(Pipe)对传入的请求参数进行 转换 和 验证,保证数据在被正式处理前是完全合法的...在 createUser 处理函数中要求客户端传递一份包含 name、age 和 gender 的数据,对于这种复杂的数据结构来说可以引入 schema (前端表单校验常用技术)来配合自定义管道实现。...首先执行 npm i --save class-validator class-transformer 安装必要的模块,接着为 CreateUserDto 增加验证相关的装饰器。...定义私有函数 toValidation,跳过非DTO的类型(非Javascript原类型)。 使用 plainToInstance 将元类型和请求体参数转为可验证的类型对象。...ValidationPipe 管道可以完全支持上述两种验证方式,我们不必为自定义验证管道花费时间。

    36120

    从零开始的 Nest.js

    路由 nest 中的路由是位于一个被Controller装饰的类中,每个路由是该类中的一个方法,该方法被Get``Post等装饰器装饰,而返回的值则是响应对象。...请求过滤 nest 同样提供了强大了请求过滤,你可以使用之前为 swagger 准备的 Dto 模型,在此基础上加以扩展,即可对请求体的模型进行验证。验证通过 nest 的管道(Pipe)。...首先安装 class-validator,之后 main.ts 中引入全局管道 ValidationPipe,ValidationPipe是 nest 提供的一个类似于Joi之类的 Schema 验证器...,他通过调用 class-validator来识别该属性是否正确或者需要,已阻止不必要的 nosql 注入。...user.dto.ts 2import { ApiProperty } from '@nestjs/swagger' 3import { 4 IsString, 5 IsNotEmpty, 6} from 'class-validator

    1.7K20

    学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)

    它利用JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和...首先我们安装两个需要的依赖包:class-transformer和class-validator npm install class-validator class-transformer -S 然后在...create-post.dto.ts文件中添加验证, 完善错误信息提示: import { IsNotEmpty, IsNumber, IsString } from 'class-validator'...,上面只编写了一些常用的验证,class-validator还提供了很多的验证方法, 大家感兴趣可以自己看官方文档....,不带author参数, 返回数据有很清晰了: 通过上边的学习,可以知道DTO本身是不存在任何验证功能, 但是我们可以借助class-validator来让DTO可以验证数据 总结 至此我们Nest.js

    14.6K65

    TypeGraphQL的尝试

    构建 初始化工程 egg.js 对 TypeScript 现在已经有了比较好的支持 (参考),下面我们先创建一个基于 TypeScript 的 egg.js 工程。...Resolver(of => Recipe) 返回的对象添加一个字段处理 方法参数: @Root:获取当前查询对象 @Ctx:获取当前上下文,这里可以拿到 egg 的 Context (见上面中间件集成中的处理...authorizedField: string; @Authorized("ADMIN") @Field() adminField: string; } Validation TypeGraphQL 默认集成了 class-validator...import { MaxLength, Length } from "class-validator"; @InputType() export class RecipeInput { @Field...我们在正式使用中目前也没有遇到大的问题,该项目目前也比较活跃,很多新的特性也在开发中,建议可以做一些尝试。

    2.3K10

    学完这篇 Nest.js 实战,还没入门的来锤我!(长文预警)

    它利用JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和...首先我们安装两个需要的依赖包:class-transformer和class-validator npm install class-validator class-transformer -S 复制代码...然后在create-post.dto.ts文件中添加验证, 完善错误信息提示: import { IsNotEmpty, IsNumber, IsString } from 'class-validator...,上面只编写了一些常用的验证,class-validator还提供了很多的验证方法, 大家感兴趣可以自己看官方文档....,不带author参数, 返回数据有很清晰了: 通过上边的学习,可以知道DTO本身是不存在任何验证功能, 但是我们可以借助class-validator来让DTO可以验证数据 总结 至此我们Nest.js

    10.5K11

    使用NestJS搭建服务端应用

    /core": "^8.1.1", "@nestjs/platform-express": "^8.1.1", "class-transformer": "^0.5.1", "class-validator...image-20220114230042606 验证控制层创建的控制器 接下来,我们来验证下前面在AppController.ts中写的两个方法是否能正常运行。...当很多方法都都需要传入相同参数时,要写很多重复代码,可维护性大大降低。 参数的有效性验证需要写在控制器内的方法中,会产生冗余代码。...:nest-绑定管道 随后,我们即可在dto层中使用它的相关装饰器来校验参数了,AppDto.ts的部分代码如下所示: import { IsString, MinLength } from "class-validator...我们从class-validator'包中引入了string类型的验证装饰器,它还能验证其它类型,感兴趣的开发者请移步:class-validator#usage VO层(返回给客户端的视图) 通常情况下

    2.1K40

    TypeScript 5.0 正式发布!

    TypeScript 5.0 实现了新的装饰器标准、更好地支持 Node 和打构建工具中的 ESM 项目的功能、库作者控制泛型推导的新方法、扩展了 JSDoc 功能、简化了配置,并进行了许多其他改进。...下面来重写 loggedMethod 以利用它并打印出被修饰的方法的名称。...因此,在这些情况下,使用node16或nodenext解析选项可能是更好的方法。 自定义解析标志 JavaScript 工具现在可以模拟“混合”解析规则,就像上面描述的打包工具模式一样。...imports 和 exports 的类型修饰符在这些情况下会有帮助。我们可以明确指定import或export仅用于类型分析,并且可以在JavaScript文件中使用类型修饰符完全删除。...还是 JavaScript 文件中编写,TypeScript 都可以让我们知道是否错误地调用了函数。

    3.9K70

    TypeScript--deno前置学习

    4.TypeScript和JavaScript的对比 ypeScript 与JavaScript两者的特性对比,主要表现为以下几点: (1)TypeScript是一个应用程序级的JavaScript开发语言...第10节:引用类型-正则表达式 用于验证最好最强大的手段目前为止就是正则表达式。TypeScript的RegExp类表示正则表达式。...第12节: 面向对象编程-修饰符 访问修饰符 TypeScript语言和Java还有C#很像(因为我只会这两个面向对象的语言),类中属性的访问可以用访问修饰符来进行限制。...第13节: 面向对象编程-继承和重写 类的继承 继承:允许我们创建一个类(子类),从已有的类(父类)上继承所有的属性和方法,子类可以新建父类中没有的属性和方法。 (1)先来创建一个父类。...TypeScript不支持多重继承。 类方法的重写 重写就是在子类中重写父类的方法。 比如:在子类中重写父类中的interest方法。

    2.6K20
    领券