Graphql Aws AppSync查询在使用解析程序时出错

Graphql Aws AppSync查询在使用解析程序时出错,graphql,aws-appsync,Graphql,Aws Appsync,我是AWS AppSync的新手,但是它很容易学习和理解 我正在尝试创建一个解析器,当用户运行getChore(id:)时,它将返回所有的chore信息。如果它成功地做到了这一点,问题就出在杂务中有两个字段:createdBy&assignedTo链接到用户类型 type Chore { id: ID! title: String desc: String status: String reward: Float retryDeduction: F

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

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

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:User
createdBy:User
,因此我的查询如下所示:

 query getChore {
      getChore(id: "36d597c8-2c7e-4f63-93ee-38e5aa8f1d5b") {
        id
        ...
        ...
        assignedTo {
          id
          f_name
          l_name
        }
        createdBy {
          id
          f_name
          l_name
        }
      }
    }
但是,当我发出此查询时,我得到一个错误:

提供的键元素与架构不匹配(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ValidationException;

我已经研究过了,似乎找不到正确的解决方法

im使用的解析器是:

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

$util.toJson($ctx.result)

当您收到
提供的key元素与架构不匹配的错误时,这是因为您的请求映射模板
key
与DynamoDB中的主键不匹配。您可以在应用程序设置中启用CloudWatch日志,以准确查看发送到DynamoDB的内容

如果您能回答与您的应用程序相关的问题,我无法知道您的模板有什么问题,因为您的示例缺少一些信息: -用户存储在哪里?他们存储在自己的DDB表中,与琐事分开吗?用户表
id
上的散列键也是这样吗? -在
杂务
表中,您如何知道您的杂务是
分配给
还是
创建的?杂务DDB项上是否存储了用户id? -您发布的请求映射模板是否与附加到
Chore.assignedTo
的解析程序相对应?如果是,使用
$ctx.args.id
将实际基于Chore id而不是分配给它的用户执行GetItem

最后,我复制了你的应用程序,我能够使它工作与一些变化

先决条件:
  • 我有一个
    chores
    和一个
    users
    DynamoDB表,两者都有
    id
    作为散列键。这两个表在AppSync中映射为数据源
  • 我在家务表中有一个家务看起来像
和用户表中的两个用户:

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

  • 我使用了您的GraphQL模式
解析器 指向
chores
表的
Query.getchores上的解析器:

{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
    }
}
指向用户表的
Chore.assignedTo
上的解析器(注意
$ctx.source.assignedTo
而不是
$ctx.args

类似地,
Chore.createdBy上的解析器指向用户表:

{
  "f_name": "Alice",
  "id": "2",
  "l_name": "Wonderland"
}
{
    "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"
      }
    }
  }
}
希望有帮助

{
  "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"
      }
    }
  }
}