@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)
111:尝试连接到 AWS EC2 实例上的 Flask 应用程序时出现连接被拒绝错误
AWS弹性Beanstalk / nginx:connect()失败(111:连接被拒绝