如何从 GraphQL 模式创建验证规则

Posted

技术标签:

【中文标题】如何从 GraphQL 模式创建验证规则【英文标题】:how do I create validation rules from a GraphQL schema 【发布时间】:2020-07-15 14:05:21 【问题描述】:

如何将一个简单的 GraphQL 模式(我可以通过导入访问服务器端并通过查询访问客户端)转换为验证规则?

我可以看到如何为枚举做到这一点,假设我有一个标题:

  enum Title 
    Mr, Ms, Mrs, Dr
  

我可以通过查询访问可能的值

  __type (name: "Title") 
    name
    enumValues 
      name
    
  

现在我可以在客户端创建下拉列表或在服务器上创建验证,但是如何编码和访问例如字符串字段的最小/最大长度?还是数字的最小值/最大值?

是否需要为每个字段添加自定义类型?还是有更好的方法?


[编辑]回应丹尼尔的回答:

我正在使用 yup 进行验证,这是一个很棒的库,但例如,如果某个字段在 gql InputType 上是必需,我如何将它放入 yup 架构中?

我如何在前端使用那个 yup 模式?理想情况下,我想对其进行序列化,将其发送给客户端,然后在那里重建验证。

我能想到的唯一另一种方法是共享代码,但是每次架构更改时我都需要重新构建和重新部署客户端,这当然是不可能的:/

【问题讨论】:

【参考方案1】:

有多种数据验证,例如:

数据类型(这个值是字符串还是数字?) 范围(此值是否在此值范围内?) 约束(这个值是否满足这个正则表达式?) 一致性(结束日期是否晚于开始日期?) 引用(提供的标识符是否引用实际存在的实体?)

像 GraphQL 这样的强类型语言只能真正提供数据类型验证。您的 GraphQL 服务可能会执行其他类型的验证(通过您的数据源、您的数据模型、自定义 GraphQL 标量等)——但是,只有 type 信息可以从服务中内省。自省不是向客户传达其他验证逻辑的合适工具。

如果您在后端使用 Node.js,并且您的目的是在后端和前端之间共享验证逻辑,那么最好的方法是使用像 yup 或 joi 这样的库。

【讨论】:

谢谢!我实际上 am 使用 yup 进行验证,但我不明白这如何阻止我重复信息。我已对问题进行了编辑以解释我的意思。 您将无法避免 yup 架构和 GraphQL 架构之间的重复——就像数据库中的类型与数据模型或 GraphQL 类型中的类型之间存在重复一样。您需要使用 this library 之类的东西来序列化 yup 模式。是否使用 GraphQL 或其他端点将其提供给您的客户端取决于您。 可能有更合适的库来序列化模式。这只是我偶然发现的第一个。我以前用过 yup,但只使用过一个通用模块在我的应用程序之间共享架构,所以 YMMV。 好的,我想那将不得不这样做。感谢您的链接,能够序列化一个 yup 模式将有很长的路要走!

以上是关于如何从 GraphQL 模式创建验证规则的主要内容,如果未能解决你的问题,请参考以下文章

AWS Amplify with GraphQL - 按不同类型的用户定义身份验证规则

GraphQL 中模式级和应用级错误的混合

如何从 FormRequest 类方法中访问当前经过身份验证的用户

如何从页面添加、删除或交换 jQuery 验证规则?

创建自定义 codeigniter 验证规则

如何创建一个验证规则,使field3不等于表中的field2