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: 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
}
}
}
但是,当我触发此查询时,我收到错误消息:
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)
答案 0 :(得分:1)
当您收到The provided key element does not match the schema
错误时,这是因为您的请求映射模板key
与DynamoDB中的主键不匹配。您可以在“应用程序”设置中启用CloudWatch Logs,以准确查看发送到DynamoDB的内容。
我无法知道您的模板出了什么问题,因为您的示例缺少一些信息,如果您可以回答与您的应用程序有关的问题:
-用户存放在哪里?它们是否与琐事分开存储在自己的DDB表中,并且用户表id
上的哈希键也是吗?
-在chores
表中,您如何知道您的杂项是assignedTo
或createdBy
的用户?杂项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"
}
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"
}
}
}
}
希望有帮助!