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

ssc*_*ssc 5 amazon-dynamodb reactjs graphql aws-appsync aws-amplify

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

到目前为止,我设法遵循了AWS文档(特别是在此处此处)成功创建了示例TODO应用(第三代码段)并启用了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)
Run Code Online (Sandbox Code Playgroud)

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

type Todo @model {
  id: ID!
  name: String!
  description: String
}
Run Code Online (Sandbox Code Playgroud)

amplify pushschema.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")
}
Run Code Online (Sandbox Code Playgroud)

问:与AWS AppSync GraphQL后端通信时,如何处理React应用程序中的“复杂”对象?

作为一个(人为的)示例,假设我想添加一个Blog对象Post和一个Comment对象,那么我能否以某种方式将所有对象传递给单个ConnectReact组件中的单个突变?还是我必须先触发一个Blog突变,然后再触发另外两个?还是我必须考虑自定义schema.graphqlAmplify为我生成的(辅助)和JavaScript文件?

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

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

Sha*_*aju 6

只是为了区分,复杂对象是AWS AppSync用来表示使用S3元数据的术语。在您所说的复杂性中,您指的是非平凡的模式。

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

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

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

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

我们正在寻找改善开发人员体验的几种方法,您将在不久的将来看到一些更新。