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

Posted

技术标签:

【中文标题】AWS Appsync:如何创建一个解析器来检索标识符数组的详细信息?【英文标题】:AWS Appsync: How can I create a resolver that retrieves the details for an array of identifiers? 【发布时间】:2019-03-18 15:28:16 【问题描述】:

这感觉很基本,所以我希望找到提到的这个场景,但是我已经搜索并找不到与我的场景匹配的示例。我有 2 个要组合的端点(我正在使用 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 数据源的方法。

【问题讨论】:

你看过Batch Resolvers吗?听起来你的学生表是一个表,所以你可以这样做:docs.aws.amazon.com/appsync/latest/devguide/… 如果您的数据源是 DynamoDB,但我的数据源是 HTTP,批处理解析器似乎可以工作。我编辑了我的帖子以明确说明这一点。 【参考方案1】:

我向 AWS Support 提出了一个案例,并被告知他们知道这样做的唯一方法是创建一个 Lambda 解析器:

    获取一组学生 ID 为每个人调用学生端点 返回一组学生详细信息

【讨论】:

【参考方案2】:

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

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

并将其添加到您的响应对象中。然后,将解析器挂接到StudentDetailsstudent 字段,然后您就可以将$context.source.id 用于单个学生API 调用。每个id 都会从数组中分离出来,成为自己的网络请求。

【讨论】:

我们决定不使用 AppSync,所以我可能不会尝试这个,但它看起来会起作用。谢谢!【参考方案3】:

不要在响应中调用您的学生端点,而是使用管道解析器并使用存储、上下文 (prev.result/result) 等缝合来自不同步骤的响应。

【讨论】:

以上是关于AWS Appsync:如何创建一个解析器来检索标识符数组的详细信息?的主要内容,如果未能解决你的问题,请参考以下文章

Aws Appsync 解析器:如何创建解析器以更新列表映射 (DynaMoDB) 中的项目

如何在部署前从@aws-cdk/aws-appsync 检索 schema.graphql 文件

基于位置的 AWS AppSync 事件订阅

如何使用 Aws AppSync 将 JWT 令牌(或任何其他变量)从父解析器传递给子解析器

AWS AppSync Lambda 解析器获取查询返回类型

AWS AppSync 解析器内部超时配置