提问者:小点点

动态GraphQL模式?


我有一个要提交表单数据的突变,这个数据可能会因您填写的表单而异。

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

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

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

这两种形式:

  • Generic info(GenericInfo):姓名出生日期
  • 你吃什么?(whYouFood):姓名Fav水果

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

例如,如果我称之为突变:

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

formName设置为formData设置为{nameAndSurname:'Foo Bar',“apple”},它应该会抛出错误,因为GenericInfo不期望dateOfBirth

这可以用GraphQL实现吗?也许有更好的方法到达这里吗?


共2个答案

匿名用户

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

我见过的最常见的模式采用Relay GraphQL突变约定(即使您不希望您的客户端使用Relay)。这对于每个可能的操作都有一个突变(在您的情况下,每个提交的表单都有一个突变),并且每个突变都有不同的输入对象类型。

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

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

input Fruit {
  name: String!
}

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

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

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

匿名用户

如果GraphQL提供了一个可以用作输入的Union类型,就有可能做到这一点。这之前已经提出过,但似乎没有计划在不久的将来实现它。

因此,由于表单数据上有几十种可能的组合,我认为您最好的选择是发送一个带有数据的JSON格式的字符串,然后自己进行验证,使用一些定义所有可能的formName及其允许字段的结构。

但是这样你就不会利用GraphQL打字系统了。