一般来说,我对 AppSync(和 GraphQL)还是很陌生,但是在将解析器连接到我们的 DynamoDB 表时遇到了一个奇怪的问题。具体来说,我们有一个嵌套的 Map 结构,用于我们任意构建的项目属性之一(其复杂性和形式取决于父项目的类型)——有点像这样:
"item" : {
"name": "something",
"country": "somewhere",
"data" : {
"nest-level-1a": {
"attr1a" : "foo",
"attr1b" : "bar",
"nest-level-2" : {
"attr2a": "something else",
"attr2b": [
"some list element",
"and another, for good measure"
]
}
}
},
"cardType": "someType"
}
我们附带的 GraphQL 类型如下:
type Item {
name: String!
country: String!
cardType: String!
data: AWSJSON! ## note: it was originally String!
}
当我们查询该项目时,我们得到以下响应:
{
"data": {
"genericItemQuery": {
"name": "info/en/usa/bra/visa",
"country": "USA:BRA",
"cardType": "visa",
"data": "{\"tourist\":{\"reqs\":{\"sourceURL\":\"https://travel.state.gov/content/passports/en/country/brazil.html\",\"visaFree\":false,\"type\":\"eVisa required\",\"stayLimit\":\"30 days from date of entry\"},\"pages\":\"One page per stamp required\"}}"
}}}
问题是我们似乎无法让Item.data
字段解析器返回 JSON 对象(即使我们在通用查询解析器之上附加了一个单独的字段级解析器)。它总是返回一个字符串,奇怪的是,如果我们将预期的字段类型更改为字符串!,响应将:
用=
. 我们已经用我们的响应解析器尝试了一切,包括如何使用 appsync 从 DynamoDB 返回 JSON 对象?,但我们完全停留在这一点上。
在上述帖子中的建议均无效后,我们当前的查询响应解析器已恢复为标准响应:
## 'Before' response mapping template on genericItemQuery query; same result as the 'After' listed below **
#set($result = $ctx.result)
#set($result.data = $util.parseJson($ctx.result.data))
$util.toJson($result)
## 'After' response mapping template **
$util.toJson($ctx.result)
我们试图避免需要为每个嵌套级别包含支持类型的情况data
(因为它会根据父项类型而变化,并且在我给出的示例中它可以有三层或四层),我们认为改变的模式类型AWSJSON!
会做的伎俩。不过,我开始担心无法绕过重建我们的基本模式。任何相反的建议都会有所帮助!
PS 我在 CloudWatch 日志中注意到context.result.data
响应字段下存在适当的 JSON 响应,但不知何故有以下内容transformedTemplate
(再次,考虑到我们没有应用任何映射模板,除了将结果转换为有效的JSON):
"arn": ...
"transformedTemplate": "{data={tourist={reqs={sourceURL=https://travel.state.gov/content/passports/en/country/brazil.html, visaFree=false, type=eVisa required, stayLimit=30 days from date of entry}, pages=One page per stamp required}}, resIds=USA:BRA, cardType=visa, id=info/en/usa/bra/visa}",
"context": ...
为这个冗长的问题道歉,但我很难过。