AWS AppSync Lambda解析器字段

Mih*_*aga 5 amazon-web-services aws-lambda graphql aws-appsync

我有以下查询:

query xxx {
   getSomething(id: "id") {
      field1
      field2
   }
}
Run Code Online (Sandbox Code Playgroud)

在lambda中,我有什么办法得到field1和得到field2吗?例如,仅查询mysql中的那些字段,而不是获取所有字段以供稍后AppSync丢弃。

我尝试将所有日志记录$context在请求映射器VTL文件中,但它们不存在。有任何想法吗?无法做到这一点似乎很愚蠢。我在lambda中唯一遇到的就是id参数。

谢谢Mihai

Tri*_*ped 5

AppSync 现在支持获取GraphQL 信息对象。您可以从selectionSetList变量中获取请求列的列表。

Info 对象的布局:

{
    "fieldName": "string",
    "parentTypeName": "string",
    "variables": { ... },
    "selectionSetList": ["string"],
    "selectionSetGraphQL": "string"
}
Run Code Online (Sandbox Code Playgroud)

将 selectionSetList 属性传递给 lambda 解析器的示例:

{
    "version" : "2017-02-28",
    "operation": "Invoke",
    "payload": {
        "arguments": $utils.toJson($ctx.args),
        "selectionSetList": $utils.toJson($ctx.info.selectionSetList),
        "selectionSetGraphQL": $utils.toJson($ctx.info.selectionSetGraphQL)
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您尝试传递 selectionSetList,则需要专门引用它(如上例所示)。如果 info 对象直接通过类似$utils.toJson($ctx.info).


tho*_*ace 4

这可能不是您想听到的答案,但正如您所发现的那样,AppSync 根本无法使 graphql(字段或其他)可供您使用。

我可以给你的唯一两个“选择”是:

  • 设计您的查询模式,以便您可以更精确地获取(例如getThingFromTableA,而getThingFromTableB不仅仅是getThing
  • 使用字段解析器来获取昂贵的字段,如果这些都来自同一数据源(例如{ cheapA, cheapB, expensiveA { expensiveTableAThingA, expensiveTableAThingB }, expensiveB }),则使用嵌套对象。

注意,这并不罕见,例如Apollo 默认情况下也不会