Это кажется простым, поэтому я ожидал найти упомянутый сценарий, но я искал и не могу найти пример, который соответствует моему сценарию. У меня есть 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.
Похоже, что пакетные преобразователи работают, если ваш источник данных - DynamoDB, а мой - HTTP. Я отредактировал свой пост, чтобы прямо об этом сказать.


Я открыл дело в AWS Support, и мне сказали, что единственный способ, который они знают, это создать Lambda Resolver, который:
Это не идеально, но можно создать промежуточный тип.
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, поэтому я, вероятно, не буду пробовать это, но похоже, что это сработает. Спасибо!
Вместо того, чтобы вызывать конечную точку вашего ученика в ответе, используйте преобразователь конвейера и сшивайте ответ из разных шагов, используя тайник, контекст (предыдущий результат / результат) и т. д.
Вы смотрели Пакетные преобразователи? И похоже, что ваш стол для учеников - это одна таблица, поэтому вы можете сделать что-то вроде этого: docs.aws.amazon.com/appsync/latest/devguide/…