AWS-Amplify API 模块:如何使 GraphQL 字段独一无二?

Phi*_*ren 13 graphql aws-appsync aws-amplify

AWS-Amplify 提供了几个指令来构建 GraphQL-API。但我还没有找到如何确保字段的唯一性。

我想在 GraphCool 中做类似的事情:

type Tag @model @searchable {
  id: ID!
  label: String! @isUnique
}
Run Code Online (Sandbox Code Playgroud)

这是一个 AWS-Amplify 特定问题。这不是关于如何使用通用 GraphQL 来做到这一点。它非常具体地介绍了如何使用 AWS-Amplify 的 API 模块执行此操作。( https://aws-amplify.github.io/docs/js/api )

mpa*_*ris 7

嘿谢谢你的问题。默认情况下,使用 amplify-cli 还无法做到这一点,但您可以使用管道解析器和 DynamoDB 表上的额外索引自行完成。执行此操作的步骤如下:

  1. 在标签为 HASH KEY 的表上创建 GSI。
  2. Mutation.createTag在架构中的字段上创建管道解析器。您可以Mutation.createTag通过将 @model 定义更改为 来关闭自动生成的突变@model(mutations: { update: "updateTag", delete: "deleteTag" })
  3. 创建一个名为的函数LookupLabel,该函数Query针对新的 GSI发出label = $ctx.args.input.label. 如果这返回一个值,则抛出一个错误$util.error("Label is not unique")。如果它没有返回值,则继续。
  4. 创建一个名为的函数CreateTag,该函数PutItem针对 Tag 表发出 a 。
  5. 将这两个函数添加到您的管道解析器中。

您可以在此处阅读有关管道解析器的更多信息https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html

截至撰写时,amplify 尚不支持自定义和管道解析器,但您可以在https://github.com/aws-amplify/amplify-cli/issues/574 上阅读有关该功能的更多信息,因为将来会支持它。现在,您可以在 AWS AppSync 控制台中手动添加解析器,也可以通过您自己的 CloudFormation 模板添加解析器,该模板以 Amplify 创建的 API 的 ID 为目标。如果您在此处创建问题 ( https://github.com/aws-amplify/amplify-cli/issues ) 并将其标记为功能请求,这也会很有帮助,因为可以使用 @unique 指令自动执行此操作但这需要计划。

谢谢

  • 感谢您的详细阐述!我相信 Amplify 和 AWS 服务非常强大,但开发人员的体验却很糟糕。每个模块都有一些复杂的配置和/或处理,我从未在开发过程中感到如此痛苦。我真的很喜欢这个概念和它背后的想法,但这是最后一根稻草。我将删除 Amplify 和所有模块(托管除外)并采用更“传统”的方法。我不会用这个来完成事情。 (13认同)