AWS AppSync: передать аргументы от родительского распознавателя детям - PullRequest
0 голосов
/ 26 сентября 2018

В AWS AppSync аргументы, отправляемые по основному запросу, не пересылаются всем распознавателям дочерних элементов.

type Query {
  article(id: String!, consistentRead: Boolean): Article
  book(id: String!, consistentRead: Boolean): Book
}

type Article {
  title: String!
  id: String!
}

type Book {
  articleIds: [String]!
  articles: [Article]!
  id: String!
}

при вызове:

query GetBook {
  book(id: 123, consistentRead: true) {
    articles {
      title
    }
  }
}

первого запросаполучить книгу получает параметр consistentRead в $context.arguments, но последующий запрос для получения статьи не делает.($context.arguments пусто)

Я также пытался articles(consistentRead: Boolean): [Article]! внутри book, но не повезло.

Кто-нибудь знает, возможно ли в AppSync передавать аргументы всем запросам в частитот же запрос?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Возможна передача аргументов от родителя к потомку через ответ.Позвольте мне объяснить ...

Внутри AppSync есть несколько контейнеров $context:

  • аргументы
  • stash
  • source

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}"
}

и затем извлеките его в шаблон отображения запроса дочернего элемента так же, как в первом обходном пути.

0 голосов
/ 10 мая 2019

Просто в дочернем элементе используйте $ ctx.source. id , где id - это параметр, который вам нужен для ссылки от родителя.

0 голосов
/ 26 сентября 2018

Вам не нужно передавать аргументы в подзапрос.Основываясь на своей схеме и сценарии использования, я думаю, что вы можете настроить свою схему, как показано ниже, чтобы иметь отношение между Author и Book

type Author {
    # parent's id
    bookID: ID!
    # author id
    id: ID!
    name: String!
}

type Book {
    id: ID!
    title: String!
    author: [Author]!
}

type Mutation {
    insertAuthor(bookID: ID!, id: ID!, name: String!): Author
    insertBook(id: ID!, title: String!): Book
}

type Query {
    getBook(id: ID!): Book
}

- Создать таблицу Author с Author.bookIDв качестве первичного ключа и Author.id в качестве ключа сортировки
- Создать таблицу Book с Book.id в качестве первичного ключа

Затем необходимо прикрепить преобразователь для Book.author

enter image description here

А вот преобразователь для insertAuthor мутации

{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        "bookID" : $util.dynamodb.toDynamoDBJson($ctx.args.bookID),
        "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id)
    },
    "attributeValues" : {
        "name" : $util.dynamodb.toDynamoDBJson($ctx.args.name)
    }
}

А когда вы сделаете запрос getBook, вы получите список авторовс таким же идентификатором книги, как показано ниже

enter image description here

...