@connection 上的 AWS Amplify Graphql 查询

Posted

技术标签:

【中文标题】@connection 上的 AWS Amplify Graphql 查询【英文标题】:AWS Amplify Graphql query on @connection 【发布时间】: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"

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

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

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

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

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

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

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

【问题讨论】:

【参考方案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/…) 中发现了自定义解析器。我的第一个问题现在像魅力一样工作,现在我正在创建更高级的解析器。

以上是关于@connection 上的 AWS Amplify Graphql 查询的主要内容,如果未能解决你的问题,请参考以下文章

间歇性无法连接到 AWS RDS 上的 mysql(错误 2003)

AWS — AWS Direct Connect

111:尝试连接到 AWS EC2 实例上的 Flask 应用程序时出现连接被拒绝错误

AWS弹性Beanstalk / nginx:connect()失败(111:连接被拒绝

aws-amplify-react Connect 首先返回未定义的数据

aws 胶水中的 catalog_connection 参数是啥?