动态GraphQL模式?

时间:2018-07-09 17:30:01

标签: graphql apollo

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

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

因此,我们可能有以下可重复使用的步骤:

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

这两种形式:

  • 常规信息(genericInfo):姓名和出生日期
  • 你吃什么? (whatYouEat):名称和姓氏+喜爱的水果

我需要一种具有单个突变的方法,该方法允许定义表单名称,并采用一个data对象,该对象需要基于此类表单名称进行验证。

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

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

,将formName设置为genericInfo,将formData设置为{ nameAndSurname: 'Foo Bar', favFruit: 'apple' },则应该抛出错误,因为genericInfo不希望favFruit ,但dateOfBirth

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

2 个答案:

答案 0 :(得分:1)

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

我见过的最常见的模式是采用Relay GraphQL mutation conventions(即使您不希望客户使用中继)。每种可能的操作都有一个突变(在您的情况下,每个提交的表单有一个突变),每个突变都有不同的输入对象类型。

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

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

input Fruit {
  name: String!
}

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

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

这将允许在不同的突变类型之间重用架构的公共部分。

答案 1 :(得分:0)

如果GraphQL提供了可用作输入的Union类型,则可以执行此操作。这个has been suggested before,但似乎没有计划在不久的将来实施。

因此,由于表单数据上会有数十种可能的组合,所以我认为最好的选择是仅将JSON格式的字符串与数据一起发送,并使用定义所有可能的结构自己进行验证formName及其允许的字段。

但是,这样一来,您就不会利用GraphQL输入系统。