graphql - 在 AppSync/GraphQL 中,您如何处理需要来自多个数据源的连接数据的列表?
问题描述
type Employee {
id: String!
name: String
lastObservedStatus: String
}
type Query {
employees: [Employee]
}
这是一个虚构的模式来说明我的问题。我有两个单独的数据源,它们返回需要连接以填充响应的列表。第一个数据源“employee list api”是一个 http API,我可以查询以获取可用于填充id
和name
列的权威员工列表。例如,我得到这样的响应:
[
{"id": "001", "name": "Harry"},
{"id": "002", "name": "Jerry"},
{"id": "003", "name": "Larry"}
]
我有第二个 http API“员工观察日志”,我可以查询以获取状态列表以及相关的 ID。id 允许我将号码与员工记录中的条目相关联,并且我有一个记录日期。可能有不止一个状态记录,但在 GraphQL 中我只想选择最近的一个。示例响应:
[
{"id":"002", "TimeStamp":"2021-07-01T12:30:00Z", "status": "eating"},
{"id":"002", "TimeStamp":"2021-07-01T13:10:00Z", "status": "staring out the window"},
{"id":"001", "TimeStamp":"2021-07-01T16:00:00Z", "status": "sleeping in lobby"}
]
现在,我希望 graphQL 响应返回如下内容:
{
"data": {
"employees": [
{
"id": "001",
"name": "Harry",
"lastObservedStatus": "sleeping in lobby"
},
{
"id": "002",
"name": "Jerry",
"lastObservedStatus": "staring out the window"
},
{
"id": "003",
"name": "Larry",
"lastObservedStatus": null
}
]
}
}
由于“员工列表 api”是有关员工存在的权威来源,因此对“员工”字段的所有查询都应始终触发对该 api 的查询,但“员工观察日志”api 仅应在“lastObservedStatus”字段时触发在查询中被选中。
对于这样的模式,解析器应该在哪里注册?我读过最好的做法是始终在叶节点上附加解析器,但我不确定在这种情况下如何做到这一点。我什至不确定如果您在列表的子字段上附加解析器会发生什么。
我觉得处理这个问题的正确方法是将 lambda 解析器附加到该employees
字段,并在 lambda 解析器中检查查询的 selectionSetList 以检查是否选择了“lastObservedStatus”字段。如果不是,则 lambda 仅查询“员工列表 api”,否则 lambda 还会查询“员工观察日志”并在返回结果之前执行类似于 SQL 连接的操作。但这是处理这个问题的正确方法吗?
解决方案
听起来您需要的是字段上的解析器,该lastObservedStatus
字段使用您的第二个 API(“员工观察日志”)作为数据源,其中 Query 字段employees
使用第一个 API 作为其数据源。
此解析器应使用上下文源字段(在本例中为“父”值,id
您name
可以Employee
参考)进行查询。例如,您可以在 VTL 代码中引用它$ctx.source.id
,或者$ctx.source.name
如果您需要名称。
这个解析器应该只查询单个员工的状态,因为它会在您的 Query field 中的每个employees
结果中调用一次。
还有另一种选择,即拥有一个 2 函数管道解析器,其中每个函数指向不同的数据源:
- 第 1 步解析所有字段,除了
lastObservedStatus
- 步骤 2 解决
lastObservedStatus
并使用$ctx.prev.result
.
这实现起来会比较麻烦,但如果设计得当,将需要更少的 API 调用。
推荐阅读
- python - 在python中的两个数据帧之间逐行查找错误差异
- java - jconsole GUI 未在 OSX 上显示
- javascript - 添加简单的 fetch 调用时,如何避免在代码中的数百个位置添加“异步”?
- python - 对列表中每个整数的位数求和
- ember.js - 带有波浪号的 ember sass 导入文件
- firebase - Firebase 安全规则与数据库中的属性
- typescript - Nestjs typesafe mongoose,模型函数不要求正确的类型(任何)
- java - Java - 具有 thread.sleep 的多个线程的不同绘制
- database - 区域 xtrabackup 文件夹之间的 AWS EC2 rsync
- node.js - 为什么我的数据没有添加到 heroku 沙箱数据库中?