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

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

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

  enum Title {
    Mr, Ms, Mrs, Dr
  }

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

  __type (name: "Title") {
    name
    enumValues {
      name
    }
  }

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

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


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

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

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

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

【问题讨论】:

    标签: validation graphql


    【解决方案1】:

    有多种数据验证,例如:

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

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

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

    【讨论】:

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