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
并将其添加到您的响应对象中。然后,将解析器挂接到StudentDetails
的student
字段,然后您就可以将$context.source.id
用于单个学生API 调用。每个id
都会从数组中分离出来,成为自己的网络请求。
【讨论】:
我们决定不使用 AppSync,所以我可能不会尝试这个,但它看起来会起作用。谢谢!【参考方案3】:不要在响应中调用您的学生端点,而是使用管道解析器并使用存储、上下文 (prev.result/result) 等缝合来自不同步骤的响应。
【讨论】:
以上是关于AWS Appsync:如何创建一个解析器来检索标识符数组的详细信息?的主要内容,如果未能解决你的问题,请参考以下文章
Aws Appsync 解析器:如何创建解析器以更新列表映射 (DynaMoDB) 中的项目
如何在部署前从@aws-cdk/aws-appsync 检索 schema.graphql 文件
如何使用 Aws AppSync 将 JWT 令牌(或任何其他变量)从父解析器传递给子解析器