AppSync似乎正在为嵌套对象的某些字段加载不正确的解析器模板 . 此外,它似乎只发生在嵌套对象具有与父对象上的字段同名的字段时 .

我在下面列举了一个例子,因为我认为这可能是解释这个问题的最好方法 . 如您所见,嵌套对象的 id 字段未正确解析 .

每种类型,任务,用户,列表和标签都有一个解析器用于 id 字段,因为每个类型的数据在id字段上都有一个前缀 . 例如,Task.id有一个返回 $context.source.task_id 的解析器,User.id有一个返回 $context.source.user_id 的解析器 . 列表和标记相同 .

似乎正在发生的事情是AppSync正在为父类型加载 id 解析器模板 . 您可以看到 task.owner.id 就是这种情况,其中 owner 是用户,但 id 被解析为 "$context.source.task_id" . task.list.id 相同,其中 list 是List . 我们再次看到 task.tags[0].owner.id . owner 再次成为用户,除非此时父项是标记,因此 task.tags[0].owner.id 被解析为 "$context.source.tag_id" . 这三个示例表明问题不是特定类型,因为当User和List嵌套在Task中时,它们的行为相同 . 此外,我们可以看到问题不在于Task,因为当嵌套在Tag中时,User的行为类似 . 最后,我们可以看到 task.tags[1].owner.id 实际上表现正常 . 这表明该问题仅在首次执行时出现 .

在这一点上,我强烈怀疑这是AppSync的一个错误,但是,我不是百分之百 . 还有其他人遇到过这个问题吗?我做错了什么吗?

Example

询问

{
  task(id: "task-123") {
    id,
    title,
    owner {
      id,
      username,
    },
    list {
      id,
      name,
    },
    tags {
      id,
      name,
      owner {
        id,
        username,
      },
    },
  },
}

结果

{
  "data": {
    "task": {
      "id": "task-123",
      "title": "First Task",
      "owner": {
        "id": "$context.source.task_id",
        "username": "tom"
      },
      "list": {
        "id": "$context.source.task_id",
        "name": "Inbox"
      },
      "tags": [
        {
          "id": "tag-123",
          "name": "one",
          "owner": {
            "id": "$context.source.tag_id",
            "username": "tom"
          }
        },
        {
          "id": "tag-234",
          "name": "two",
          "owner": {
            "id": "user-123",
            "username": "tom"
          }
        }
      ]
    }
  }
}

任务架构

type Task {
    id: ID!
    title: String!
    owner: User!
    list: List
    tags: [Tag]
}

用户架构

type User {
    id: ID!
    username: String!
}

列表架构

type List {
    id: ID!
    name: String!
}

标记架构

type Tag {
    id: ID!
    name: String!
    owner: User!
}

任务数据

{
    task_id: "task-123",
    title: "First Task",
    owner_id: "user-123",
    list_id: "list-123",
    tags: [
        "tag-123",
        "tag-234"
    ]
}

用户数据

{
    user_id: "user-123",
    username: "tom"
}

列表数据

{
    list_id: "list-123",
    name: "Inbox"
}

标签数据

{
    tag_id: "tag-123",
    name: "one",
    owner_id: "user-123"
}

{
    tag_id: "tag-234",
    name: "two",
    owner_id: "user-123"
}

示例id解析器(用户)

请求映射模板

{
  "version": "2017-02-28",
  "payload": "$context.source.user_id"
}

响应映射模板

$util.toJson($context.result)

其他类型的id解析器非常相似

值得注意的是,我为每种类型创建了不同的无数据源,任务,用户,列表和标记 . 每种类型的id解析器都使用各自的无数据源 .