AWS AppSync React: как работать со «сложной» схемой GraphQL? - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь начать работу с AWS AppSync и AWS Amplify .

До сих пор мне удалось следовать документации AWS (особенно здесь и здесь ) для успешного создания образца приложения TODO (третий фрагмент кода) и включения API API AppSync GraphQL следующим образом:

$ amplify add api
? Please select from one of the below mentioned services GraphQL
? Provide API name: MySampleTodoAPI
? Choose an authorization type for the API API key
? Do you have an annotated GraphQL schema? No
? Do you want a guided schema creation? true
? What best describes your project: Single object with fields (e.g., “Todo” with ID, name, description)

Это создаетэто «тривиальное» schema.graphql (то есть содержащее только один объект):

type Todo @model {
  id: ID!
  name: String!
  description: String
}

amplify push генерирует гораздо более сложный, вторичный schema.graphql из файла выше, создает код JavaScript с объектами для мутацийзапросы и т. д., а также настраивает ресурсы AWS (т. е. таблицу DynamoDB, сегменты S3 и т. д.).Кажется, что в приложении есть ошибки, но, по сути, он работает, включая добавление данных, введенных в пользовательском интерфейсе, в таблицу DynamoDB.

Я создал второй образец блога, как и выше, только на этот раз, выбрав Single object with fields (e.g., “Todo” with ID, name, description) вместо Single object with fields ....

Это генерирует этот "комплекс" schema.graphql (то есть содержащий несколько связанных объектов):

type Blog @model {
  id: ID!
  name: String!
  posts: [Post] @connection(name: "BlogPosts")
}
type Post @model {
  id: ID!
  title: String!
  blog: Blog @connection(name: "BlogPosts")
  comments: [Comment] @connection(name: "PostComments")
}
type Comment @model {
  id: ID!
  content: String
  post: Post @connection(name: "PostComments")
}

Вопрос: Как сделатьЯ имею дело со «сложными» объектами в приложении React при обращении к бэкэнду AWS AppSync GraphQL?

В качестве (надуманного) примера, если предположить, что я хочу добавить новый объект Blog с одним Post иодин Comment объект, могу ли я как-то передать все объекты одной мутации в одном Connect компоненте React?Или я должен сначала вызвать мутацию Blog, а затем две другие?Или мне нужно разобраться с настройкой (вторичных) schema.graphql и файлов JavaScript, которые Amplify генерирует для меня?

К сожалению, пример кода AWS работает только с «тривиальными» схемами, а не «сложными» -и Amplify кажется настолько свежим, что все посты сторонних разработчиков и примеры проектов используют другие технологии ...

Большое спасибо за внимание!: -)

1 Ответ

0 голосов
/ 30 ноября 2018

Просто чтобы различать, сложные объекты - это термин, используемый AWS AppSync для обозначения работы с метаданными S3.В своем вопросе под комплексом вы подразумеваете нетривиальные схемы.

Насколько я понимаю, вы хотели бы сохранить группу связанных типов, используя одну мутацию.AWS AppSync позволяет вам управлять своей схемой GraphQL, присоединять источники данных к полям, писать собственную логику с помощью распознавателей VTL.Он также предоставляет переменную контекста, которая содержит аргументы вашего запроса, результаты родительских преобразователей, служебные функции и т. Д. Таким образом, вы можете использовать их, чтобы получить то, что вы хотите.В противном случае, как вы уже упоминали, в вашем приложении React сначала нужно сделать мутацию для сохранения блога, а затем - другие типы.

Вот несколько способов написать одну мутацию для связанных типов GraphQL:

  • После создания нового API-интерфейса GraphQL с помощью AWS Amplify вы все равно можете перейти к своей схеме AppSync (на консоли AWS) и добавить новый тип мутации и пользовательский преобразователь для обработки этой одной мутации.Поскольку все ваши источники данных для типов находятся в DynamoDB, вы можете использовать BatchWrite для нескольких таблиц.
  • Мы представили концепцию преобразователей конвейера на прошлой неделе.Используя это, вы можете присоединить преобразователь конвейера к типу мутации, передав Blog, Post и Comments цепочке функций, которые соответствующим образом обновляют соответствующие таблицы DynamoDB.
  • Используйте источник данных Lambda, который обновляет все 3 таблицы водин раз.
  • Обновите документ CloudFormation, сгенерированный AWS Amplify, или создайте новый дочерний стек CF для того же самого
  • Добавьте свой собственный преобразователь для моделирования пользовательских преобразователей, которые обновляют все 3 таблицы в однойиди, используя один из вышеперечисленных подходов.

AWS Amplify не сможет предоставить эту функциональность «из коробки», так как тогда это будет слишком самоуверенным и будет зависеть от варианта использования.Во многих случаях может быть плохой идеей написать несколько таблиц за один раз, не задумываясь о создании этой транзакции и применив надлежащую обработку ошибок.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...