具有类验证器的高级条件(可能)?

Posted

技术标签:

【中文标题】具有类验证器的高级条件(可能)?【英文标题】:Advanced conditions with class-validator (possible)? 【发布时间】:2020-05-30 02:53:56 【问题描述】:

我有 TypeScript NestJS 项目。

我需要验证传入的 DTO 到我的 API。它可以被描述为“创建项目”,其中我们有建筑类型(房屋、公寓、花园),并根据我们需要定义的类型:

房子:包括房间在内的楼层 公寓:房间 花园:什么都没有(它是一个“房间”)

房屋类型示例:


  type: HOUSE,
  floors: [
    
      name: "1st floor",
      rooms: [
        
          name: "bedroom"
        
      ]
    
  ]

扁平型示例:


  type: FLAT,
  rooms: [
    
      name: "bedroom"
    
  ]

我过去在 AJV 的帮助下完成了这项工作,但现在当我们迁移到 NestJS 时,我们开始使用 class-validator

我的问题是,如果我可以在class-validator 中创建那些高级条件(例如,当类型为 FLAT 时,则只期望 ROOMS,而不是 FLOORS)?

【问题讨论】:

【参考方案1】:

使用class-validator,您可以选择Conditional Validation 和Group Validation,或者您始终可以创建自定义管道并按照习惯使用AJV。对于条件验证,您可以基于 type 创建验证,然后让 class-validator 处理其余部分

【讨论】:

“你可以根据类型创建验证”,你能举个例子吗? @coler-j 如果我能弄清楚我的意思,那么绝对。我很确定我在某处看到过示例,但我现在不记得在哪里 这根本没有帮助。我也想做同样的事情。我只找到基本示例,这些示例都只是文档的副本,没有比所讨论的示例更高级的了。说有“某处的例子”并不能说明太多。【参考方案2】:

您必须为此创建一个自定义验证器。文档非常好: https://github.com/typestack/class-validator#custom-validation-classes

当您创建自定义验证器类时,在 validate 的实现中,您可以访问在 args 参数中验证的其他参数。只需编写您的 if 语句,如果不满足则返回 false。您甚至可以返回自定义错误消息并实现自己的装饰器。

【讨论】:

以上是关于具有类验证器的高级条件(可能)?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过jQuery在Razor中返回具有某些条件的验证键?

具有特定条件的电子邮件的正则表达式验证

play框架使用起来(14)-高级指南

play框架使用起来(14)-高级指南

drf 高级三验证

在 JAVA 的 elasticsearch 高级客户端中添加身份验证