我正在尝试使用AWS AppSync和AWS Amplify。
到目前为止,我设法遵循了AWS文档(尤其是here和here)成功创建了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似乎是开箱即用的,以至于所有第三方帖子和示例项目都使用其他技术...
非常感谢您的考虑! :-)
最佳答案
只是为了区分,复杂对象是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无法开箱即用地提供此功能,因为这样做会太过自以为是,并且取决于用例。在许多情况下,一次写多个表而不考虑进行事务处理和应用适当的错误处理可能不是一个好主意。
我们正在寻找改善开发人员体验的几种方法,您将在不久的将来看到一些更新。