Через ответ можно передавать аргументы от родителя к потомку. Позволь мне объяснить ...
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}"
}
а затем получить его в шаблоне сопоставления запроса дочернего элемента так же, как в первом обходном пути.
person
max
schedule
30.01.2019