动态 GraphQL 模式?

2024-05-12

我有一个突变,将提交表单数据,该数据可能会根据您填写的表单而有所不同。

表单将会很多,并且它们将共享相同的“步骤”(每个表单由 1 个或多个页面/步骤组成)。

因此,我们可能有这些可重用的步骤:

  • 最喜欢的水果
  • 出生日期
  • 名和姓

还有这两种形式:

  • 通用信息(genericInfo): 姓名 + 出生日期
  • 你吃什么? (whatYouEat): 姓名+最喜欢的水果

我需要一种方法来进行单一突变,允许定义表单名称,并采用data需要根据此类表单名称进行验证的对象。

例如,如果我将此突变称为:

submitForm(formName: $formName, formData: $formData) {
  resultMessage
}

with formName set to genericInfo and formData set to { nameAndSurname: 'Foo Bar', favFruit: 'apple' },它应该抛出一个错误,因为genericInfo不期望favFruit, but dateOfBirth.

这可以通过 GraphQL 实现吗?也许有更好的方式到达这里吗?


GraphQL 并不直接允许这样做。输入对象类型具有固定的结构,并且没有条件验证(内置;您的解析器函数可能会根据其自身的检查产生错误,这些检查比架构中的内容更丰富)。

我见过的最常见的模式采用Relay GraphQL 突变约定 https://facebook.github.io/relay/docs/en/graphql-server-specification.html#mutations(即使您不希望您的客户使用 Relay)。每个可能的操作都有一个突变(在您的情况下,每个提交的表单有一个突变),每个突变有一个不同的输入对象类型。

另请注意,输入对象类型可以嵌套,因此在您的示例中,您可以编写

input Name {
  givenName: String!
  surname: String!
}

input Fruit {
  name: String!
}

input WhatYouEatInput {
  name: Name!
  fruit: Fruit!
}

mutation {
  whatYouEat(input: WhatYouEatInput!): WhatYouEatPayload!
}

这将允许在不同的突变类型中重用模式的公共部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态 GraphQL 模式? 的相关文章

随机推荐