Возврат вложенного JSON в запрос AWS AppSync

Я новичок в AppSync (и GraphQL) в целом, но я сталкиваюсь со странной проблемой при подключении преобразователей к нашим таблицам DynamoDB. В частности, у нас есть вложенная структура карты для одного из атрибутов нашего элемента, которая создается произвольно (ее сложность и форма зависят от типа родительского элемента) - что-то вроде этого:

"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 (даже когда мы присоединяем к нему отдельный преобразователь уровня поля поверх общего преобразователя запросов). Он всегда возвращает String, и, как ни странно, если мы изменим ожидаемый тип поля на String !, ответ заменит все : в данных на =. Мы перепробовали все с нашими преобразователями ответов, включая такие предложения, как Как вернуть объект JSON из DynamoDB с помощью appsync?, но мы полностью застряли на этом этапе.

Наш текущий преобразователь ответов для нашего запроса вернулся к стандартному ответу после того, как ни одно из предложений в вышеупомянутом сообщении не сработало:

## '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! поможет. Я начинаю беспокоиться, что нет никакого способа восстановить нашу базовую схему. Любые предложения об обратном были бы полезны!

P.S. Я заметил в журналах CloudWatch, что соответствующий ответ JSON существует в поле ответа context.result.data, но каким-то образом есть следующий 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": ...

Извиняюсь за длинный вопрос, но я в тупике.

Вы изначально создавали Предмет, когда Item.data еще был String!?

Lisa M Shon 13.08.2018 07:39

Я столкнулся с этой проблемой, вы что-нибудь поняли?

Munib 14.06.2019 23:42

Не ожидайте увидеть объект JSON в ответе GraphQL для типа AWSJSON. GraphQL вернет объект JSON только для типов, которые вы объявили в схеме. Для типа AWSJSON он вернет строку, которая будет содержать экранированный JSON.

Rustem Zinnatullin 03.07.2020 10:12
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
5
3
4 174
2

Ответы 2

Вы можете попытаться создать тип для поля данных, который содержит все возможные поля, а затем разрешить поля в соответствии с родительским типом, или, в качестве альтернативы, вы можете попытаться реализовать Графические интерфейсы

AWSJSON - это строковый тип JSON, поэтому вы всегда получите строковое значение (это то, чего должно придерживаться определение вашего типа).

Другие вопросы по теме