reactjs - AWS AppSync react : how to work with "complex" GraphQL schema?

标签 reactjs amazon-dynamodb graphql aws-appsync aws-amplify

我正在尝试开始使用AWS AppSyncAWS Amplify .

到目前为止,我设法按照 AWS 文档(特别是 herehere )成功创建了 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)

这会生成这个“琐碎的”schema.graphql(即仅包含一个对象):

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

amplify push 从上面的文件生成一个更复杂的辅助 schema.graphql,使用用于突变、查询等的对象创建 JavaScript 代码,并设置AWS 资源(即 DynamoDB 表、S3 存储桶等)。该应用程序似乎存在错误,但本质上是有效的 - 包括将 UI 中输入的数据添加到 DynamoDB 表中。

我以与上述相同的方式创建了第二个示例博客应用程序,只是这次选择带有字段的单个对象(例如,带有 ID、名称、描述的“Todo”) 而不是 >带有字段的单个对象....

这会生成这个“复杂的”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 应用程序中的“复杂”对象?

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

不幸的是,AWS 示例代码仅处理“琐碎”模式,而不是“复杂”模式 - 而且 Amplify 似乎是开箱即用的,以至于所有第三方帖子和示例项目都使用其他技术...

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

最佳答案

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

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

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

  • 使用 AWS Amplify 创建新的 GraphQL API 后,您仍然可以转到 AppSync 架构(在 AWS 控制台上),并添加新的突变类型和自定义解析程序来处理此单一突变。由于您的类型数据源均位于 DynamoDB 中,因此您可以跨多个表使用 BatchWrite。
  • 我们引入了 pipeline resolvers 的概念在上周。使用此功能,您可以将博客、帖子和评论传递到一系列函数,从而将管道解析器附加到突变类型,从而相应地更新相应的 DynamoDB 表。
  • 使用 Lambda 数据源一次性更新所有 3 个表。
  • 更新 AWS Amplify 生成的 CloudFormation 文档,或为其创建新的子 CF 堆栈
  • 添加您自己的转换器,以对自定义解析器进行建模,使用上述方法之一一次性更新所有 3 个表。

AWS Amplify 无法提供开箱即用的此功能,因为这将过于固执己见且以用例为导向。在许多情况下,一次性写入多个表而不考虑使此事务性化并应用适当的错误处理可能不是一个好主意。

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

关于reactjs - AWS AppSync react : how to work with "complex" GraphQL schema?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53268991/

相关文章:

javascript - 从嵌套数组中 react DataTable 值

javascript - 在 React 中切换 aria-pressed 角色以实现 Web 可访问性的最有效方法

javascript - 异步存储检索项目中键的值

amazon-dynamodb - 在 DynamoDB GSI 的投影中使用嵌套字段

graphql - 在突变之前处理业务逻辑?

javascript - 使用 fetch 时请求正文为空

css - 仅在需要时加载 React block CSS

typescript - AWS SDK v3 - 如何让 TypeScript 编译具有自定义超时的 DynamoDB 客户端的构建?

amazon-web-services - DynamoDB.transactWriteItems 遇到一些问题

amazon-web-services - 使用 AWS AppSync 进行输入验证