Dynamo DB 中的 AWS AppSync 简单 graphql 解析器无法正常工作,这让我发疯
Posted
技术标签:
【中文标题】Dynamo DB 中的 AWS AppSync 简单 graphql 解析器无法正常工作,这让我发疯【英文标题】:AWS AppSync simple graphql resolver in Dynamo DB not working and it's driving me crazy 【发布时间】:2019-11-12 19:02:22 【问题描述】:我有一个非常简单的 graphQL 解析器,我正在尝试使用它,但无论出于何种原因,它都不是,并且即使我在用户名上设置了一个 GSI 也是我试图查询的内容,但它仍然返回 null。
GraphQL 架构:
type Query
getUsersDevByUsername(username: String!): UsersDev
type UsersDev
id: ID!
username: String!
group: Int
hasProfile: Boolean
currentSkill: Int
highestSkill: Int
查询时的 GraphQL 解析器:
"version" : "2017-02-28",
"operation" : "Query",
"index" : "username-index",
"query" :
## Provide a query expression. **
"expression": "username = :username",
"expressionValues" :
":username" : $util.dynamodb.toDynamoDBJson($ctx.args.username)
我正在尝试运行的查询:
query test
getUsersDevByUsername(username:"testUser")
id
username
group
currentSkill
highestSkill
错误:
"data":
"getUsersDevByUsername": null
,
"errors": [
"path": [
"getUsersDevByUsername",
"id"
],
"locations": null,
"message": "Cannot return null for non-nullable type: 'ID' within parent 'UsersDev' (/getUsersDevByUsername/id)"
,
"path": [
"getUsersDevByUsername",
"username"
],
"locations": null,
"message": "Cannot return null for non-nullable type: 'String' within parent 'UsersDev' (/getUsersDevByUsername/username)"
]
我不知道我做错了什么,我在解析器中包含了我正在使用的索引,并遵循解析器注释中给出的示例。这是一个如此简单的查询,我不明白为什么需要所有这些复杂性。尝试配置非常简单的查询(用 SQL 编写实际上需要 5 秒)所花费的时间真的让我对此感到厌烦。它应该是“太棒了”,但让它工作所需的样板是可笑的。
有人可以请帮我完成这项工作,这样我就可以真正从事一些富有成效的工作,而不是为什么一个简单的查询不起作用?
编辑:
所以我终于得到了这个工作。需要从以下位置更改结果:
$util.toJson($ctx.result)
到:
#if($ctx.result.items.size()>0)
$util.toJson($ctx.result.items[0])
#else
null
#end)
这是没有意义的,因为通过 id 获取它的 AWS 示例使用了第一个,但无论如何,至少它现在可以工作了。
【问题讨论】:
【参考方案1】:由于您正在运行查询,因此响应将具有以下结构:
items = [ ... ],
nextToken = "a pagination token",
scannedCount = 10
https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-query
在您想要处理该结果的响应映射模板中:
要么只返回 ctx.result.items 或者,就像您的情况一样,如果字段被标记为必填且不能为空,您需要处理空情况【讨论】:
以上是关于Dynamo DB 中的 AWS AppSync 简单 graphql 解析器无法正常工作,这让我发疯的主要内容,如果未能解决你的问题,请参考以下文章
AWS AppSync 中的 InvalidUserPoolException