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





Вы также должны написать преобразователь для 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. Еще раз спасибо!
Рад, что помог, @FrancisUpton. Мне тоже было сложно ориентироваться в документации, и нам потребовалось время, чтобы понять, как это сделать.
@macbutch Я этого не знал. Могу ли я использовать это с Amplify и редактировать вручную шаблоны JSON? (Обратите внимание, я использую не DynamoDB, а RDS). Большое спасибо.
Как насчет того, чтобы посты были разбиты на страницы? Спасибо
@Ricardo, вероятно, слишком поздно, чтобы помочь, но мы не используем Amplify, поэтому я не знаю наверняка, но не вижу, чтобы это было проблемой. Детали разбиения на страницы будут в некоторой степени отличаться в зависимости от вашего бэкэнда, но я бы рекомендовал документация graphql при разбивке на страницы. Мы используем тип соединения с Dynamo, и базовый подход должен работать и для вас (хотя я ожидал, что он будет выглядеть немного иначе).
Спасибо тебе за этот пост. Я часами пытался понять, как обрабатывать вложенные объекты ...
Вот еще один пост stackoverflow, где я подробно описываю, как это сделать. В названии говорится о мутации, но в нем рассматриваются как мутации, так и запросы. мутация для создания отношений в AWS AppSync
Я изо всех сил пытался найти достойный ответ на тот же вопрос и, наконец, нашел сообщение это Medium, где в конце очень хорошо объясняется, как получить данные во вложенном объекте JSON.