Возможна передача аргументов от родителя к потомку через ответ.Позвольте мне объяснить ...
Внутри 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))
в шаблон отображения запроса дочернего распознавателя .Он попытается получить требуемый идентификатор из аргументов и затем вернется к предыдущему результату.
Обходной путь 2 - добавьте аргумент в родительский ответ
Измените шаблон ответа родительского преобразователя навключите аргументы:
{
"items": $utils.toJson($context.result.items),
"device": "${ctx.args.device}"
}
и затем извлеките его в шаблон отображения запроса дочернего элемента так же, как в первом обходном пути.