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

从 Parse 迁移到 AWS Dynamo DB

扫描Dynamo DB中的特定行

使用nodejs的AWS Dynamo DB生产设置

如何在 AWS lambda 函数中设置 dynamo db 触发器

如何将现有的 dynamo db 与 AWS Amplify 和 graphql 一起使用