AWS AppSync React:如何使用“复杂的” GraphQL模式?

时间:2018-11-12 19:39:43

标签: 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存储桶)等)。该应用程序似乎存在错误,但实际上可以正常工作-包括将用户界面中输入的数据添加到DynamoDB表中。

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

这将生成此“复杂” 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似乎是开箱即用的,以至于所有第三方帖子和示例项目都使用其他技术... < / p>

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

1 个答案:

答案 0 :(得分:3)

仅需区分,复杂对象是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张表。

AWS Amplify无法开箱即用地提供此功能,因为这样做会太过自以为是,并且取决于用例。在许多情况下,一次写多个表可能是个好主意,而无需考虑进行此事务处理并应用适当的错误处理。

我们正在研究改善开发人员体验的几种方法,并且您应该会在不久的将来看到一些更新。