我有一个要提交表单数据的突变,这个数据可能会因您填写的表单而异。
表单将会很多,它们将共享相同的“步骤”(每个表单由1个或多个页面/步骤组成)。
因此,我们可能有这些可重用的步骤:
这两种形式:
GenericInfo
):姓名出生日期whYouFood
):姓名Fav水果我需要一种方法来进行单一突变,允许定义表单名称,并采用需要根据此类表单名称进行验证的data
对象。
例如,如果我称之为突变:
submitForm(formName: $formName, formData: $formData) {
resultMessage
}
将formName
设置为和
formData
设置为{nameAndSurname:'Foo Bar',“apple”}
,它应该会抛出错误,因为GenericInfo
不期望和
dateOfBirth
。
这可以用GraphQL实现吗?也许有更好的方法到达这里吗?
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打字系统了。