AppSync: преобразователь вложенных типов

Я пытаюсь включить вложенные типы, определенные в следующей схеме graphql:

type User {
  id: String!
  posts: [Post]
}

type Post {
  id: String!
}

type Query {
  getUser(id: String!): User
  getPost(id: String!): Post
}

Как видите, у пользователя несколько сообщений. Я использую AppSync с Таблица смежных списков Dynamodb (который содержит как пользователя, так и строку, соответствующую публикации) в качестве источника данных. В AppSync я должен использовать шаблон сопоставления запросов, но после прочтения документации я не понял, как разрешаются вложенные типы?

Я бы предположил, что при запросе getUser преобразователь Post должен вызываться с User_id. Если да, то как мне получить доступ к родительскому идентификатору в преобразователе сообщений? Здесь на место приходит ${context.source}?

Поскольку преобразователь запросов getPost будет таким же, как преобразователь Post, вызываемый дочерним элементом getUser Post, должен ли я интегрировать некоторую логику с шаблоном запроса преобразователя, чтобы иметь дело с обоими случаями?

Пример был бы действительно полезен!

Я изо всех сил пытался найти достойный ответ на тот же вопрос и, наконец, нашел сообщение это Medium, где в конце очень хорошо объясняется, как получить данные во вложенном объекте JSON.

Cris69 08.11.2018 12:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
1
6 982
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы также должны написать преобразователь для User.posts. Когда вы вызываете Query.getUser, будет вызван преобразователь, а затем, если у вас есть преобразователь для User.posts, он будет вызван с контекстом из первого преобразователя, установленного в ${context.source}.

К сожалению, у меня нет под рукой чистого примера, но если вы используете CloudFormation, у вас будет два резолвера, вроде этого:

  UserResolver:
    Type: "AWS::AppSync::Resolver"
    DependsOn: Schema
    Properties:
      ApiId: !Ref YourApiId
      TypeName: Query
      FieldName: getUser
      DataSourceName: !Ref YourDataSource
      RequestMappingTemplate: # you already have this
      ResponseMappingTemplate: ...

  UserPostsResolver:
    Type: "AWS::AppSync::Resolver"
    DependsOn: Schema
    Properties:
      ApiId: !Ref YourApiId
      TypeName: User
      FieldName: posts
      DataSourceName: !Ref YourDataSource
      RequestMappingTemplate: |
        # use context.source.id here to reference the user id
      ResponseMappingTemplate: "$util.toJson($ctx.result.items)"

Это почти все. Вы были на правильном пути, но отображение полей в преобразователи должно быть более явным, чем вы думали.

Спасибо за это. Мне не удалось найти это в документации (я пропустил это, я думаю, потому что не было таких вложенных примеров), кроме расплывчатой ​​ссылки на объект контекста, содержащий результаты родителя. Теперь я понял, что неправильно предположил, что преобразователи указаны только в типах Query или Mutation, и проигнорировал, что они могут быть указаны где угодно, что является стандартным graphQL. Еще раз спасибо!

Francis Upton IV 17.07.2018 16:33

Рад, что помог, @FrancisUpton. Мне тоже было сложно ориентироваться в документации, и нам потребовалось время, чтобы понять, как это сделать.

macbutch 18.07.2018 07:20

@macbutch Я этого не знал. Могу ли я использовать это с Amplify и редактировать вручную шаблоны JSON? (Обратите внимание, я использую не DynamoDB, а RDS). Большое спасибо.

Ricardo 06.01.2021 19:10

Как насчет того, чтобы посты были разбиты на страницы? Спасибо

Ricardo 08.01.2021 12:31

@Ricardo, вероятно, слишком поздно, чтобы помочь, но мы не используем Amplify, поэтому я не знаю наверняка, но не вижу, чтобы это было проблемой. Детали разбиения на страницы будут в некоторой степени отличаться в зависимости от вашего бэкэнда, но я бы рекомендовал документация graphql при разбивке на страницы. Мы используем тип соединения с Dynamo, и базовый подход должен работать и для вас (хотя я ожидал, что он будет выглядеть немного иначе).

macbutch 03.02.2021 07:09

Спасибо тебе за этот пост. Я часами пытался понять, как обрабатывать вложенные объекты ...

TorbenVerdorben 21.05.2021 11:07

Вот еще один пост stackoverflow, где я подробно описываю, как это сделать. В названии говорится о мутации, но в нем рассматриваются как мутации, так и запросы. мутация для создания отношений в AWS AppSync

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