AppSync Resolver 仅在我对输入进行硬编码时才起作用。 context.arguments 无效

AppSync Resolver only works when I hard code the input. context.arguments does not work

为清楚起见编辑:没有错误消息,如果输入字符串来自 context.arguments,它只是 returns 一个空列表,表明它根本没有获取输入变量在查询测试器上(当然,设置不正确会带来著名的打字错误)。我也将其制作成具有完全相同结果的管道。环顾四周,人们建议制作一个中间对象,但我肯定只是以某种方式弄错了我的输入变量。

我正在 AWS Appsync 中使用 DynamoDB 开发一个项目,我 运行 遇到了 context.arguments 输入问题。

基本上,如果我将图书 ID 的字符串硬编码到查询中(完整的上下文),代码都可以正常工作,但是如果我使用 context.arguments,它只是拒绝正常工作,返回一个空的"spines".

数组

我的架构中有以下类型:

type Book {
    id: ID!
    title: String
    spines: [Spine]
}
type Spine {
    id: ID!
    name: String
    bookId: ID!
}

我使用以下查询:

type Query {
    getBook(id: ID!): Book
query getBook($bookId: ID!){
  getBook(id: $bookId){
    title
    id
    spines {
      name
      bookId
    }
  }
}

使用以下输入(假设这是一个相关的 guid):

{
  "bookId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
}

这个 spine 对象的解析器:

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "index" : "bookId-index",
    "query" : {
        "expression": "#bookId = :bookId",
        "expressionNames" : {
        "#bookId" : "bookId"
    },
        "expressionValues" : {
            ":bookId" : { "S" : "${context.arguments.id}" }
            }
        }
    }
}

我确保我的数据集也包含误报(其他书籍的书脊),以便我知道我的查询何时返回正确的数据。

如果我将 guid 硬编码为字符串而不是使用 context.arguments,这将有效,并且得到我正在寻找的每本书 guid。

例如,用这个替换表达式值非常有效:

  "expressionValues" : {
     ":bookId" : { "S" : "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" }
  }

为什么“${context.arguments.id}”在这里获取输入变量的方式与其他查询中的方式不同?

感谢@IonutTrestian 为我指明了正确的方向。

$ctx.args 是空的,但我决定上链查看整个上下文中的内容,所以 $util.error($util.toJson($ctx)).

我发现的 json 对象包含一个名为 "Source" 的小对象,其中包含 Book 对象的查询 return。

长话短说,$ctx.source.id 应用于我的查询时很有魅力。

我还了解更多有关调试 DynamoDB 解析器的知识,以防将来遇到此类问题。非常感谢!