我正在尝试开始使用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似乎是开箱即用的,以至于所有第三方帖子和示例项目都使用其他技术... < / p>
非常感谢您的考虑! :-)
答案 0 :(得分:3)
仅需区分,复杂对象是AWS AppSync用来表示使用S3元数据的术语。在复杂的问题中,您指的是非平凡的模式。
据我了解,您希望使用一个突变来保存一堆相关类型。 AWS AppSync使您可以管理GraphQL模式,将数据源附加到字段,通过VTL解析器编写自定义逻辑。它还公开了一个上下文变量,该变量保存您的查询参数,父解析器的结果,实用程序函数等。因此,您可以使用它们来获取所需的内容。否则,就像您提到的那样,您将首先从React应用程序进行更改以保存博客,然后再添加其他类型。
以下是您可以为相关GraphQL类型编写单个突变的一些方法:
AWS Amplify无法开箱即用地提供此功能,因为这样做会太过自以为是,并且取决于用例。在许多情况下,一次写多个表可能是个好主意,而无需考虑进行此事务处理并应用适当的错误处理。
我们正在研究改善开发人员体验的几种方法,并且您应该会在不久的将来看到一些更新。