使用解析器时AWS AppSync查询出现错误

时间:2019-10-15 20:56:40

标签: graphql aws-appsync

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)

1 个答案:

答案 0 :(得分: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"
      }
    }
  }
}

希望有帮助!