AWS AppSync GraphQL输入验证-忽略其他字段?

时间:2019-05-02 07:10:05

标签: graphql aws-appsync

我的模式中有一个input类型,它可以指定许多属性。问题在于,我要发送给将保留这些对象的突变的对象是具有可能更改的任意字段的对象。就目前而言,如果我发送架构中未指定的属性,则会出现错误:

Validation error of type WrongType: argument 'input' with value (...)
   contains a field not in 'BotInput': 'ext_gps' @ 'setBot'

具体来说,我的input类型未指定属性exp_gps,并且提供了该字段。

我的问题

是否有一种方法可以使输入验证简单地忽略模式中未包含的任何属性,以便仅使用模式中指定的内容继续执行变异?通常,我不想保留其他属性,因此只要添加其他属性就可以删除它们。

1 个答案:

答案 0 :(得分:1)

GraphQL不支持任意字段,有一个RFC to support a Map type,但尚未被合并/批准到规范中。

我看到两个可能的解决方法,都需要对您的架构进行一些更改。

假设您具有以下架构:

type Mutation {
 saveBot(input: BotInput) : Boolean
}

input BotInput {
 id: ID!
 title: String
}

,输入对象是:

{
 "id": "123",
 "title": "GoogleBot",
 "unrelated": "field",
 "ext_gps": "else"
}

选项1:将任意字段作为AWSJSON

传递

您将模式更改为:

type Mutation {
 saveBot(input: BotInput) : Boolean
}

input BotInput {
 id: ID!
 title: String
 arbitraryFields: AWSJSON  // this will contain all the arbitrary fields in a json string, provided your clients can pluck them from the original object, make a map out of them and json serialize it. 
}

因此我们示例中的输入现在为:

{
 "id": "123",
 "title": "GoogleBot",
 "arbitraryFields": "{\"unrelated\": \"field\", \"ext_gps\": \"else\"}"
}

在解析器中,您可以将arbitraryFields字符串进行反序列化,然后将BotInput对象上的值进行混合,然后再将其传递给数据源。

选项2:将输入作为AWSJSON

传递

原理相同,但是您将整个BotInput传递为AWSJSON

type Mutation {
 saveBot(input: AWSJSON) : Boolean
}

您不必进行解析器水合操作,也不必更改客户端,但是由于整个BotInput现在是一个问题,因此您失去了GraphQL类型验证。