可以通过响应将参数从父级传递给子级。让我解释 ...
AppSync 里面有几个容器$context
:
arguments
并且stash
总是在调用子解析器之前被清除,从这些 Cloudwatch 日志中可以看出:
在父执行的最后 -arguments
并且stash
数据存在。
{
"errors": [],
"mappingTemplateType": "After Mapping",
"path": "[getLatestDeviceState]",
"resolverArn": "arn:aws:appsync:us-east-1:xxx:apis/yyy/types/Query/fields/getLatestDeviceState",
"context": {
"arguments": {
"device": "ddddd"
},
"prev": {
"result": {
"items": [
{
"version": "849",
"device": "ddddd",
"timestamp": "2019-01-29T12:18:34.504+13:00"
}
]
}
},
"stash": {"testKey": "testValue"},
"outErrors": []
},
"fieldInError": false
}
然后在子解析器的最开始-arguments
并且stash
始终为空白。
{
"errors": [],
"mappingTemplateType": "Before Mapping",
"path": "[getLatestDeviceState, media]",
"resolverArn": "arn:aws:appsync:us-east-1:yyy:apis/xxx/types/DeviceStatePRODConnection/fields/media",
"context": {
"arguments": {},
"source": {
"items": [
{
"version": "849",
"device": "ddddd",
"timestamp": "2019-01-29T12:18:34.504+13:00"
}
]
},
"stash": {},
"outErrors": []
},
"fieldInError": false
}
解决方法 1 - 从上一个结果中获取参数。
在上面的例子device
中总是存在于父解析器的响应中,所以我插入了
#set($device = $util.defaultIfNullOrBlank($ctx.args.device, $ctx.source.items[0].device))
进入子解析器的请求映射模板。它将尝试从参数中获取所需的 ID,然后返回到先前的结果。
解决方法 2 - 将参数添加到父响应
修改您的父解析器响应模板以包含参数:
{
"items": $utils.toJson($context.result.items),
"device": "${ctx.args.device}"
}
然后以与第一个解决方法相同的方式在子项的请求映射模板中检索它。