【问题标题】:Aws AppSync Query erring out while using a resolver使用解析器时 Aws AppSync 查询出错
【发布时间】:2020-02-12 14:21:46
【问题描述】:

我是 AWS AppSync 的新手,但它很容易学习和理解。

我正在尝试创建一个解析器,当用户运行getChore(id: "") 时,它将返回所有杂务信息。它成功地做到了,问题在于有两个字段:createdBy & assignedTo 链接到 user 类型。

type Chore {
    id: ID!
    title: String
    desc: String
    status: String
    reward: Float
    retryDeduction: Float
    required: Boolean
    createdDate: AWSDateTime
    date: AWSDateTime
    interval: String
    assignedTo: User
    createdBy: User
}

type User {
    id: ID!
    age: Int
    f_name: String
    l_name: String
    type: Int
    admin: Boolean
    family: Family
}

在 aws appsync 中尝试将解析器附加到 assignedTo: UsercreatedBy: User,因此我的查询将如下所示:

 query getChore {
      getChore(id: "36d597c8-2c7e-4f63-93ee-38e5aa8f1d5b") {
        id
        ...
        ...
        assignedTo {
          id
          f_name
          l_name
        }
        createdBy {
          id
          f_name
          l_name
        }
      }
    }

然而,当我启动这个查询时,我得到一个错误:

The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException;

我已经研究过,但似乎找不到正确的解决方案。

我使用的解析器是:

{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
    }
}

返回:

$util.toJson($ctx.result)

【问题讨论】:

    标签: graphql aws-appsync


    【解决方案1】:

    当您收到 The provided key element does not match the schema 错误时,这是​​因为您的请求映射模板 key 与 DynamoDB 中的主键不匹配。您可以在应用程序设置中启用 CloudWatch Logs,以准确查看发送到 DynamoDB 的内容。

    我无法知道您的模板有什么问题,因为您的示例缺少一些信息,如果您可以回答与您的申请相关的问题: - 用户存储在哪里?它们是否存储在自己的 DDB 表中,与杂务分开,用户表 id 上的哈希键是否也是如此? - 在chores 表中,您如何知道您的工作是assignedTocreatedBy 的哪个用户?杂项 DDB 项上是否存储了用户 ID? - 您发布的请求映射模板是否与Chore.assignedTo 所附的解析器相对应?如果是,则使用 $ctx.args.id 实际上会根据杂务 id 而不是分配给它的用户来执行 GetItem。

    最后,我复制了您的应用程序,并通过一些更改使其工作。

    先决条件:

    • 我有一个chores 和一个users DynamoDB 表,两者都具有id 作为哈希键。这两个表在 AppSync 中映射为数据源。
    • 我在杂务表中有一项家务,看起来像
    {
      "assignedTo": "1",
      "createdBy": "2",
      "id": "36d597c8-2c7e-4f63-93ee-38e5aa8f1d5b",
      "title": "Chore1"
    }
    

    还有用户表中的两个用户:

    {
      "f_name": "Alice",
      "id": "2",
      "l_name": "Wonderland"
    }
    

    {
      "f_name": "John",
      "id": "1",
      "l_name": "McCain"
    }
    
    • 我使用了你的 GraphQL 架构

    解析器

    Query.getChore 上的解析器指向 chores 表:

    {
        "version": "2017-02-28",
        "operation": "GetItem",
        "key": {
            "id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
        }
    }
    

    Chore.assignedTo 上的解析器指向用户表(注意 $ctx.source.assignedTo 而不是 $ctx.args

    {
        "version": "2017-02-28",
        "operation": "GetItem",
        "key": {
            "id": $util.dynamodb.toDynamoDBJson($ctx.source.assignedTo),
        }
    }
    

    同样,Chore.createdBy 上的解析器指向用户表:

    {
        "version": "2017-02-28",
        "operation": "GetItem",
        "key": {
            "id": $util.dynamodb.toDynamoDBJson($ctx.source.createdBy),
        }
    }
    

    所有解析器响应映射模板都使用直通。

    运行查询

    最后,运行查询时:

    query getChore {
          getChore(id: "36d597c8-2c7e-4f63-93ee-38e5aa8f1d5b") {
            id
            assignedTo {
              id
              f_name
              l_name
            }
            createdBy {
              id
              f_name
              l_name
            }
          }
        }
    

    我得到以下结果:

    {
      "data": {
        "getChore": {
          "id": "36d597c8-2c7e-4f63-93ee-38e5aa8f1d5b",
          "assignedTo": {
            "id": "1",
            "f_name": "John",
            "l_name": "McCain"
          },
          "createdBy": {
            "id": "2",
            "f_name": "Alice",
            "l_name": "Wonderland"
          }
        }
      }
    }
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 2019-09-24
      • 2021-04-21
      • 2018-10-11
      • 2019-04-16
      • 2019-02-03
      • 2019-12-06
      • 1970-01-01
      • 2020-09-13
      相关资源
      最近更新 更多