【问题标题】:AWS Amplify Graphql query on @connection@connection 上的 AWS Amplify Graphql 查询
【发布时间】:2019-09-07 01:45:20
【问题描述】:

我正在为 Graphql/AppSync 使用 AWS Amplify(前端使用 Cli 和 Angular 7)并且想知道当超过 10 个项目时如何获取所有连接的项目?

假设我创建了一个这样的 schema.graphql:

type User @model {
  id: ID!
  firstname: String
  lastname: String
  project: Project @connection(name: "ProjectUsers")
}

type Project @model {
  id: ID!
  title: String
  task: String
  members: [User] @connection(name: "ProjectUsers")
}

运行放大推送时,它会生成查询和突变。当使用项目 id(来自生成的 API.service.ts 文件)运行 GetProject 查询时,它会返回带有连接用户的项目项。但是如果项目有超过 10 个用户,它只会给我前 10 个用户和下一个令牌:

{
  id: "67b1fc0a-fd1f-4e8b-9bd7-b82b2aea5d3b",
  title: "Test",
  task: "test",
  members: {
    items: {
      0: {__typename: "User", id: "f245809a...}
      1: ...
      (2-8: ...)
      9: ...
      nextToken: "qwerj23r2kj....3223oop32kjo",
       __typename: "ModelUserConnection";
    }
  }
  __typename: "Project"
}

我可以看到多种解决方案,但不知道如何去做:

  1. 是否可以更改 schema.grapql 以更改 codegen 以便它可以生成更改限制的能力,例如。 100 而不是标准的 10?

  2. 使用 nextToken 对生成的 API.service.ts 文件中的结果进行分页?

  3. 更改 schema.graphql 文件,使生成的 ModelUserFilterInput 具有 userProjectId 字段(用于生成的 ListUsers 查询)?

或者是否有任何其他解决方案可以通过自动生成的文件 (API.service.ts) 中的查询来获取项目的所有用户?

到目前为止,我能看到的唯一解决方案是首先运行 ListUsers 查询(不带任何过滤器),然后遍历所有查询以检查它是否具有正确的项目 ID。但是如果用户数据库很大,这可能会增长为大量数据并且非常慢,并且使用@connection 的好处并不真正存在。

很抱歉发了很长的帖子,我希望我已经充分解释了这个问题。

【问题讨论】:

    标签: angular aws-appsync aws-amplify


    【解决方案1】:

    A) 更改您的查询

    query {
      getProjet(id: "123") {
        id
        members(limit: 50) {
          items {
            firstname
          }
        }
     }
    

    B) 附加解析器

    AWS AppSync 控制台中,位于架构部分的右端。按UserConnection 或类似过滤器查找UserConnection.items 并单击Attach

    1) 数据源:UserTable0

    2) 请求映射模板:ListItems

    {
        "version" : "2017-02-28",
        "operation" : "Scan",
        "limit": $util.defaultIfNull(${ctx.args.limit}, 50),
        "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.nextToken, null))
    }
    

    使用ctx.args.limit作为参数的限制,或者如果它为空,则使用50

    3) 响应映射模板

    $util.toJson($ctx.result.items)
    

    通过这样做,您可以更改基础表的扫描/获取方式。

    C) 分页

    另一种解决方案是在应用程序级别进行分页并保留 10 项限制。

    注意:我可能缺少其他解决方案。

    更新:将此解决方案与 Amplify 控制台一起使用。

    现在,您可以在本地更新解析器并使用 Amplify CLI 将更新推送到您的帐户中。以下是它的工作原理。

    创建 AWS AppSync API 后,您现在将在 API 文件夹中的 Amplify 项目中创建一个名为解析器的新空文件夹。要创建自定义解析器,请创建一个文件(即 Query.getTodo.req.vtl)在您的 API 项目的 resolvers 目录中。下次您运行 amplify push 或 amplify api gql-compile 时,将使用您的解析器模板而不是自动生成的模板。您可以类似地创建一个 Query.getTodo.res.vtl 文件来更改解析器的响应映射模板的行为。

    <amplify-app>
        |_ amplify
          |_ .config
          |_ #current-cloud-backend
          |_ backend
            |_ api
              |_ resolvers
                 Query.getProject.req.vtl
                 Query.getProject.res.vtl
          team-provider-info.json
    

    More details, 11 Feb 2019

    【讨论】:

    • 感谢您的详细回复。我可能最终会为临时解决方法这样做。问题是我正在使用 Amplify Cli 创建所有解析器、表等来创建我的后端。和 Amplify 控制台收听差异。 git repos 创建差异。具有差异的应用程序版本。 (但类似)后端。通过执行 manuell 配置,我将不得不手动更改应用程序的每个版本。当我更改模型或添加新模型时,我将不得不再次使用它(如果我没记错的话?)。如果有人对 Cli 有解决方案,我会将问题留待更长时间。
    • 没错!你越来越近了。您应该能够通过 CLI 执行相同的操作。只需要找到在哪里进行我指出的更改。
    • 经过更多研究后,我在 2 月 11 日 (aws.amazon.com/blogs/mobile/…) 的此更新中找到了解决方案。我会更新我的答案。
    • 感谢您的帮助。您的第一个答案让我走上了正轨,我在放大文档 (aws-amplify.github.io/docs/cli/…) 中发现了自定义解析器。我的第一个问题现在像魅力一样工作,现在我正在创建更高级的解析器。
    猜你喜欢
    • 2022-10-24
    • 2021-01-25
    • 2020-07-22
    • 2020-01-17
    • 2020-07-01
    • 2019-11-30
    • 2020-07-27
    • 2020-04-08
    • 1970-01-01
    相关资源
    最近更新 更多