AWS Appsync:如何创建解析器来检索标识符数组的详细信息?

时间:2018-10-13 17:59:52

标签: graphql aws-appsync resolver

这感觉很基本,所以我希望找到提到的这种情况,但是我已经搜索了并且找不到与我的情况相匹配的示例。我有两个端点要结合使用(我正在使用HTTP数据源)。

班级:

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

和学生:

{
    id: String,
    lastName: String
}

我想要的是一个看起来像这样的模式:

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

通过阅读,我知道我需要在Class.studentDetails上使用某种解析程序,该解析程序将返回学生对象的数组/列表。我看到的大多数示例都显示了根据班级ID(ctx.source.id)检索“学生”列表,但是在这种情况下不起作用。我需要给每个学生打电话1次,并传入学生ID(我无法按班级ID获取学生列表)。

有没有一种方法可以为Class / studentDetails编写一个解析器,该解析器循环遍历Class中的学生ID,并为每个学生的学生端点调用一个端点?

我在请求映射模板中正在考虑以下问题:

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

编辑:阅读下面Lisa Shon的评论后,我意识到用于DynamoDB数据源的批处理解析器可以执行此操作,但是我看不到对HTTP数据源执行此操作的方法。

3 个答案:

答案 0 :(得分:0)

我向AWS Support开了一个案例,被告知他们唯一知道这样做的方法是创建一个Lambda Resolver:

  1. 获取一组学生ID
  2. 呼叫每个学生的端点
  3. 返回一系列学生详细信息

答案 1 :(得分:0)

这并不理想,但是您可以创建一个中间类型。

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

Class的解析器模板中,创建这些学生ID的列表

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

并将其添加到您的响应对象。然后,将解析器挂接到student的{​​{1}}字段,然后您就可以对单个学生API调用使用StudentDetails。每个$context.source.id都会脱离数组,并且是它自己的Web请求。

答案 2 :(得分:0)

不要在响应中调用学生端点,而是使用管道解析器,并使用存储,上下文(上一步结果/结果)等从不同步骤拼接响应。