使用解析器时 Aws AppSync 查询出错
Aws AppSync Query erring out while using a resolver
我是 AWS AppSync 的新手,但它非常容易学习和理解。
我正在尝试创建一个解析器,当用户运行时 getChore(id: "")
它将 return 所有杂务信息。它成功地做到了,问题在于琐事中有两个字段: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),
}
}
return:
$util.toJson($ctx.result)
当您收到 The provided key element does not match the schema
错误时,这是因为您的请求映射模板 key
与 DynamoDB 中的主键不匹配。您可以在应用程序设置中启用 CloudWatch Logs,以准确查看发送到 DynamoDB 的内容。
我不知道你的模板有什么问题,因为你的样本缺少一些信息,如果你能回答与你的申请有关的问题:
- 用户存储在哪里?它们是否与琐事分开存储在自己的 DDB table 中,用户 table id
上的散列键也是如此吗?
- 在 chores
table 你怎么知道你的家务是 assignedTo
还是 createdBy
?琐事 DDB 项目中是否存储了用户 ID?
- 您发布的请求映射模板是否对应于附加到 Chore.assignedTo
的解析器?如果是,使用 $ctx.args.id
实际上会根据杂务 ID 而不是分配给它的用户执行 GetItem。
最后,我复制了您的应用程序,并通过一些更改使其正常工作。
先决条件:
- 我有一个
chores
和一个 users
DynamoDB table,它们都有 id
作为哈希键。这两个 table 在 AppSync 中映射为数据源。
- 我有一件家务活table看起来像
{
"assignedTo": "1",
"createdBy": "2",
"id": "36d597c8-2c7e-4f63-93ee-38e5aa8f1d5b",
"title": "Chore1"
}
和用户table中的两个用户:
{
"f_name": "Alice",
"id": "2",
"l_name": "Wonderland"
}
和
{
"f_name": "John",
"id": "1",
"l_name": "McCain"
}
- 我使用了你的 GraphQL 模式
解析器
Query.getChore
上的解析器指向 chores
table:
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
}
}
Chore.assignedTo
上的解析器指向用户 table(注意 $ctx.source.assignedTo
而不是 $ctx.args
)
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.source.assignedTo),
}
}
同样,Chore.createdBy
上的解析器指向用户 table:
{
"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"
}
}
}
}
希望对您有所帮助!
我是 AWS AppSync 的新手,但它非常容易学习和理解。
我正在尝试创建一个解析器,当用户运行时 getChore(id: "")
它将 return 所有杂务信息。它成功地做到了,问题在于琐事中有两个字段: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),
}
}
return:
$util.toJson($ctx.result)
当您收到 The provided key element does not match the schema
错误时,这是因为您的请求映射模板 key
与 DynamoDB 中的主键不匹配。您可以在应用程序设置中启用 CloudWatch Logs,以准确查看发送到 DynamoDB 的内容。
我不知道你的模板有什么问题,因为你的样本缺少一些信息,如果你能回答与你的申请有关的问题:
- 用户存储在哪里?它们是否与琐事分开存储在自己的 DDB table 中,用户 table id
上的散列键也是如此吗?
- 在 chores
table 你怎么知道你的家务是 assignedTo
还是 createdBy
?琐事 DDB 项目中是否存储了用户 ID?
- 您发布的请求映射模板是否对应于附加到 Chore.assignedTo
的解析器?如果是,使用 $ctx.args.id
实际上会根据杂务 ID 而不是分配给它的用户执行 GetItem。
最后,我复制了您的应用程序,并通过一些更改使其正常工作。
先决条件:
- 我有一个
chores
和一个users
DynamoDB table,它们都有id
作为哈希键。这两个 table 在 AppSync 中映射为数据源。 - 我有一件家务活table看起来像
{
"assignedTo": "1",
"createdBy": "2",
"id": "36d597c8-2c7e-4f63-93ee-38e5aa8f1d5b",
"title": "Chore1"
}
和用户table中的两个用户:
{
"f_name": "Alice",
"id": "2",
"l_name": "Wonderland"
}
和
{
"f_name": "John",
"id": "1",
"l_name": "McCain"
}
- 我使用了你的 GraphQL 模式
解析器
Query.getChore
上的解析器指向 chores
table:
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
}
}
Chore.assignedTo
上的解析器指向用户 table(注意 $ctx.source.assignedTo
而不是 $ctx.args
)
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($ctx.source.assignedTo),
}
}
同样,Chore.createdBy
上的解析器指向用户 table:
{
"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"
}
}
}
}
希望对您有所帮助!