使用AWS AppSync,在一个请求中获取一对多的关联
概述
AWS AppSync是一项托管服务,用于在AWS上构建GraphQL服务器。
作为GraphQL的特点之一,它允许客户端指定要获取的字段。
GraphQL 和嵌套字段。
在GraphQL模式中,可以将一个类型指定为另一个类型的字段。
type User {
name: String!
posts: [Post]
}
type Post {
id: ID!
content: String!
user: User!
}
只需要一个选项:
通过正确地将解析器附加到此模式上,
-
- Postとそれを作成したユーザーを取得
- ユーザーとそのユーザーが作成したPostの配列を取得
这样一来,您可以通过一个请求获得相关数据。
需要在中国境内尽可能地对以下进行同义转述:
疑问点
假设有如上所示的User和Post模型,并将它们分别存储在UserTable和PostTable中。
PostTable中有一个名为userId的属性,它作为连接两个表的外键。
那么,获取包含嵌套字段的数据的GraphQL查询如下。
query getPost {
getPost(id: "99999") {
id
content
user {
name
}
}
}
只需要给定id = 99999作为查询参数,就可以找到Post。
但是,Post的创建者该如何进行特定呢?
GraphQL模式中没有标记字段为外键的规范。
在领域中附加解析器
由于Post.user是一个User类型,所以它不会自动根据userId进行JOIN操作。
为了实现所需的功能,需要为Post.user附加一个解析器。
在此情况下,我想要从UserTable获取数据,因此指定与UserTable对应的数据源作为解析器的数据来源。只需编写一个简单的映射模板来获取一项数据即可。
由于这次使用了Amazon DynamoDB作为数据源,所以将会是以下的形式。
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.source.userId),
}
}
$util.toJson($ctx.result)
重点在于请求映射模板中的$ctx.source.userId部分。
由于getPost查询的执行结果存储在$ctx.source中,因此我们可以使用该结果去UserTable中取数据。
总结
在开发移动应用程序/单页应用程序时,可能会遇到一些挑战,比如一个屏幕上需要多个模型的信息,导致请求数量增加,以及难以创建可重复使用的终端点来整合这些信息。
通过使用GraphQL,可以非常简单地获取跨多个实体的数据。
我之前一直使用REST,开始使用GraphQL时遇到了一些困惑,希望能够逐渐总结并解决这些问题。