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解析器都使用各自的无数据源 .