AWS AppSync React:如何使用 "complex" GraphQL 架构?

AWS AppSync React: how to work with "complex" GraphQL schema?

我正在尝试开始 AWS AppSync and AWS Amplify

到目前为止,我设法遵循 AWS 文档(尤其是 here and here) to successfully create a sample TODO app(第三个代码片段)并启用 AppSync GraphQL API,如下所示:

$ amplify add api
? Please select from one of the below mentioned services GraphQL
? Provide API name: MySampleTodoAPI
? Choose an authorization type for the API API key
? Do you have an annotated GraphQL schema? No
? Do you want a guided schema creation? true
? What best describes your project: Single object with fields (e.g., “Todo” with ID, name, description)

这会生成这个 "trivial" schema.graphql(即只包含一个对象):

type Todo @model {
  id: ID!
  name: String!
  description: String
}

amplify push 从上面的文件生成一个更复杂的次要 schema.graphql,创建 JavaScript 代码,其中包含用于突变、查询等的对象,并且还设置 AWS 资源(即 DynamoDB table、S3 存储桶等)。该应用程序似乎有错误,但基本上可以正常工作 - 包括将 UI 中输入的数据添加到 DynamoDB table.

我用与上述相同的方式创建了第二个示例博客应用程序,只是这次选择 Single object with fields (e.g., “Todo” with ID, name, description) 而不是 Single object with fields ...

这会生成这个 "complex" schema.graphql(即包含多个连接的对象):

type Blog @model {
  id: ID!
  name: String!
  posts: [Post] @connection(name: "BlogPosts")
}
type Post @model {
  id: ID!
  title: String!
  blog: Blog @connection(name: "BlogPosts")
  comments: [Comment] @connection(name: "PostComments")
}
type Comment @model {
  id: ID!
  content: String
  post: Post @connection(name: "PostComments")
}

问题:与 AWS AppSync GraphQL 后端通信时,我如何处理 React 应用程序中的 "complex" 对象?

作为一个(人为的)示例,假设我想添加一个新的 Blog 对象,其中包含一个 Post 和一个 Comment 对象,我能否以某种方式将所有对象传递给单个对象单个 Connect React 组件中的突变?还是我必须先触发 Blog 突变,然后再触发其他两个突变?或者我是否必须考虑自定义 Amplify 为我生成的(辅助)schema.graphql 和 JavaScript 文件?

不幸的是,AWS 示例代码仅处理 "trivial" 模式,而不处理 "complex" 模式 - 并且 Amplify 似乎开箱即用,所有第三方帖子和示例项目都使用其他技术...

非常感谢您的考虑! :-)

为了区分,复杂对象是 AWS AppSync 用来表示使用 S3 元数据的术语。在你的复杂问题中,你的意思是非平凡的模式。

据我了解,您想使用单个突变来保存一堆相关类型。 AWS AppSync 让您可以管理 GraphQL 架构、将数据源附加到字段、通过 VTL 解析器编写自定义逻辑。它还公开了一个上下文变量,其中包含您的查询参数、父解析器的结果、实用函数等。因此您可以使用这些来获得您想要的。否则,就像您提到的那样,您将首先从您的 React 应用程序中进行更改以保存博客,然后是其他类型。

以下是您可以为相关 GraphQL 类型编写单个突变的一些方法:

  • 使用 AWS Amplify 创建新的 GraphQL API 后,您仍然可以转到 AppSync 架构(在 AWS 控制台上),并添加新的突变类型和自定义解析器来处理这个单一突变。由于您的类型数据源都在 DynamoDB 中,因此您可以跨多个表使用 BatchWrite。
  • 我们在上周介绍了 pipeline resolvers 的概念。使用它,您可以通过将 Blog、Post 和 Comments 传递给函数链来将管道解析器附加到突变类型,从而相应地更新相应的 DynamoDB 表。
  • 使用 Lambda 数据源一次性更新所有 3 个表。
  • 更新 AWS Amplify 生成的 CloudFormation 文档,或为其创建新的子 CF 堆栈
  • 添加您自己的转换器来模拟您的自定义解析器,使用上述方法之一一次性更新所有 3 个表。

A​​WS Amplify 无法提供开箱即用的此功能,因为这将过于固执己见且受用例驱动。在许多情况下,一次写入多个表而不考虑进行此事务处理并应用适当的错误处理可能不是一个好主意。

我们正在想办法改善开发者体验,您应该会在不久的将来看到一些更新。