使用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附加一个解析器。

AppSyncのフィールドにリゾルバーをアタッチ

在此情况下,我想要从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时遇到了一些困惑,希望能够逐渐总结并解决这些问题。

广告
将在 10 秒后关闭
bannerAds