@connection 上的 AWS Amplify Graphql 查询
AWS Amplify Graphql query on @connection
我正在为 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 时,它 returns 带有连接用户的项目项。但是如果项目有超过 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更改代码生成器,使其能够生成更改限制的能力,例如。 100 而不是标准的 10?
使用 nextToken 对结果进行分页,来自生成的 API.service.ts 文件?
更改 schema.graphql 文件,使生成的 ModelUserFilterInput 具有 userProjectId 字段(用于生成的 ListUsers 查询)?
或者是否有任何其他解决方案可以通过自动生成的文件 (API.service.ts) 中的查询获取项目的所有用户?
到目前为止,我能看到的唯一解决方案是首先 运行 ListUsers 查询(没有任何过滤器),然后遍历所有查询以检查它是否具有正确的项目 ID。但是,如果用户数据库很大,这可能会增长到大量数据并且非常慢,并且使用 @connection 的好处并不存在。
很抱歉post,我希望我已经充分解释了这个问题。
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)
通过这样做,您可以更改基础 table 的方式 scanned/fetched。
C) 分页
另一种解决方案是在应用程序级别分页并保留 10 个项目的限制。
注意:我可能遗漏了其他解决方案。
更新:将此解决方案与 Amplify Console 一起使用。
现在,您可以在本地更新解析器并使用 Amplify CLI 将更新推送到您的帐户。这是它的工作原理。
创建 AWS AppSync API 后,您现在将在 API 文件夹的 Amplify 项目中创建一个名为 resolvers 的新空文件夹。要创建自定义解析器,请创建一个文件(即
Query.getTodo.req.vtl) 在您的 API 项目的 解析器目录 中。下次您 运行 放大推送或放大 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
我正在为 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 时,它 returns 带有连接用户的项目项。但是如果项目有超过 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更改代码生成器,使其能够生成更改限制的能力,例如。 100 而不是标准的 10?
使用 nextToken 对结果进行分页,来自生成的 API.service.ts 文件?
更改 schema.graphql 文件,使生成的 ModelUserFilterInput 具有 userProjectId 字段(用于生成的 ListUsers 查询)?
或者是否有任何其他解决方案可以通过自动生成的文件 (API.service.ts) 中的查询获取项目的所有用户?
到目前为止,我能看到的唯一解决方案是首先 运行 ListUsers 查询(没有任何过滤器),然后遍历所有查询以检查它是否具有正确的项目 ID。但是,如果用户数据库很大,这可能会增长到大量数据并且非常慢,并且使用 @connection 的好处并不存在。
很抱歉post,我希望我已经充分解释了这个问题。
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)
通过这样做,您可以更改基础 table 的方式 scanned/fetched。
C) 分页
另一种解决方案是在应用程序级别分页并保留 10 个项目的限制。
注意:我可能遗漏了其他解决方案。
更新:将此解决方案与 Amplify Console 一起使用。
现在,您可以在本地更新解析器并使用 Amplify CLI 将更新推送到您的帐户。这是它的工作原理。
创建 AWS AppSync API 后,您现在将在 API 文件夹的 Amplify 项目中创建一个名为 resolvers 的新空文件夹。要创建自定义解析器,请创建一个文件(即 Query.getTodo.req.vtl) 在您的 API 项目的 解析器目录 中。下次您 运行 放大推送或放大 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