AWS Appsync: как создать преобразователь, который извлекает сведения о массиве идентификаторов?

Это кажется простым, поэтому я ожидал найти упомянутый сценарий, но я искал и не могу найти пример, который соответствует моему сценарию. У меня есть 2 конечные точки (я использую источники данных HTTP), которые я пытаюсь объединить.

Класс:

{
   id: string,
   students: [
      <studentID1>,
      <studentID2>,
      ...
   ]
 }

и студент:

{
    id: String,
    lastName: String
}

Я бы хотел, чтобы схема выглядела так:

Student: {
   id: ID!
   lastName: String
}
Class: {
   id: ID!,
   studentDetails: [Student]
}

Из прочтения я знаю, что мне нужен какой-то преобразователь для Class.studentDetails, который вернет массив / список ученических объектов. Большинство примеров, которые я видел, показывают получение списка учеников на основе идентификатора класса (ctx.source.id), но в данном случае это не сработает. Мне нужно вызвать в конечную точку студентов 1 раз на каждого студента, передав идентификатор студента (я не могу получить список студентов по идентификатору класса).

Есть ли способ написать преобразователь для Class / studentDetails, который перебирает идентификаторы учащихся в классе и вызывает конечную точку моих учеников для каждого из них?

Я думал примерно так в шаблоне сопоставления запросов:

#set($studentDetails = [])
#foreach($student in $ctx.source.students) 
   #util.qr(list.add(...invoke web service to get student details...))
#end
$studentDetails

Обновлено: прочитав комментарий Лизы Шон ниже, я понял, что это делает пакетный преобразователь для источников данных DynamoDB, но я не вижу способа сделать это для источников данных HTTP.

Вы смотрели Пакетные преобразователи? И похоже, что ваш стол для учеников - это одна таблица, поэтому вы можете сделать что-то вроде этого: docs.aws.amazon.com/appsync/latest/devguide/…

Lisa M Shon 15.10.2018 23:49

Похоже, что пакетные преобразователи работают, если ваш источник данных - DynamoDB, а мой - HTTP. Я отредактировал свой пост, чтобы прямо об этом сказать.

Nathan Wright 16.10.2018 00:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
1
2
3 170
3

Ответы 3

Я открыл дело в AWS Support, и мне сказали, что единственный способ, который они знают, это создать Lambda Resolver, который:

  1. Принимает массив студенческих идентификаторов
  2. Вызывает конечную точку ученика для каждого
  3. Возвращает массив сведений о студенте.

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

type Student {
  id: ID!
  lastName: String
}
type Class {
  id: ID!,
  studentDetails: [StudentDetails]
}
type StudentDetails {
  student: Student
}

В шаблоне преобразователя для Class создайте список этих идентификаторов учащихся.

#foreach ($student in $class.students)
  $util.qr($studentDetails.add({"id": "$student.id"}))
#end

и добавьте его в свой объект ответа. Затем подключите преобразователь к полю student в StudentDetails, и тогда вы сможете использовать $context.source.id для индивидуального вызова API студента. Каждый id будет выделен из массива и станет отдельным веб-запросом.

Мы решили не использовать AppSync, поэтому я, вероятно, не буду пробовать это, но похоже, что это сработает. Спасибо!

Nathan Wright 07.11.2018 16:17

Вместо того, чтобы вызывать конечную точку вашего ученика в ответе, используйте преобразователь конвейера и сшивайте ответ из разных шагов, используя тайник, контекст (предыдущий результат / результат) и т. д.

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