动态GraphQL模式?

动态GraphQL模式?,graphql,apollo,Graphql,Apollo,我有一个变种,它将提交一个表单数据,这些数据可能因您填写的表单而异 表单将非常多,它们将共享相同的“步骤”(每个表单由1个或多个页面/步骤组成) 因此,我们可能有以下可重复使用的步骤: Fav水果 出生日期 姓名 这两种形式: 通用信息(genericInfo):姓名+出生日期 你吃什么?(whatYouEat):姓名+Fav水果 我需要一种方法来进行单一变异,允许定义表单名称,并获取一个data对象,该对象需要基于这样的表单名称进行验证 例如,如果我称之为突变: submitForm(

我有一个变种,它将提交一个表单数据,这些数据可能因您填写的表单而异

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

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

  • Fav水果
  • 出生日期
  • 姓名
这两种形式:

  • 通用信息(
    genericInfo
    ):姓名+出生日期
  • 你吃什么?(
    whatYouEat
    ):姓名+Fav水果
我需要一种方法来进行单一变异,允许定义表单名称,并获取一个
data
对象,该对象需要基于这样的表单名称进行验证

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

submitForm(formName: $formName, formData: $formData) {
  resultMessage
}
formName
设置为
genericInfo
并且
formData
设置为
{name和姓氏:'Foo Bar',favFruit:'apple'}
时,它应该抛出一个错误,因为
genericInfo
不需要
favruit
,而是
出生日期


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

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

我见过的最常见的模式采用了(即使您不希望您的客户使用中继)。每个可能的操作有一个变异(在您的案例中,每个提交的表单有一个变异),每个变异有一个不同的输入对象类型

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

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

input Fruit {
  name: String!
}

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

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

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

如果GraphQL提供了一个可以用作输入的联合类型,那么就有可能做到这一点。但似乎没有计划在不久的将来实施

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


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

谢谢,这是我目前使用的实现。。。但是如果我有100个表单,它就不能扩展:-(即使我们使用JSON类型来存储,过滤数据也是非常困难的。