使用解析器时 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: 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),
    }
}

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

希望对您有所帮助!