AWS AppSync Lambda解析器字段

时间:2018-11-13 09:39:26

标签: amazon-web-services aws-lambda graphql aws-appsync

我有以下查询:

query xxx {
   getSomething(id: "id") {
      field1
      field2
   }
}

我有什么办法可以获取field1field2的lambda吗?例如,仅查询mysql中的那些字段,而不是获取所有这些字段以供稍后由AppSync丢弃。

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

谢谢, 密海

3 个答案:

答案 0 :(得分:3)

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

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

  • 设计查询架构,以便您可以更精确地进行抓取(例如getThingFromTableAgetThingFromTableB而不只是getThing
  • 使用字段解析器昂贵地获取字段,如果嵌套对象都来自同一数据源(例如{ cheapA, cheapB, expensiveA { expensiveTableAThingA, expensiveTableAThingB }, expensiveB }),则使用嵌套对象。

n.b。并非罕见,例如Apollo doesn't by default either

答案 1 :(得分:2)

AppSync现在支持获取GraphQL Info object。您可以从selectionSetList变量中获取请求的列的列表。

信息对象的布局:

{
    "fieldName": "string",
    "parentTypeName": "string",
    "variables": { ... },
    "selectionSetList": ["string"],
    "selectionSetGraphQL": "string"
}

将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)
    }
}

注意::如果您试图传递selectionSelectList,则需要专门引用它(如上例所示)。如果直接用$utils.toJson($ctx.info)之类的信息对象传递信息对象,则该列表将不可用。

答案 2 :(得分:0)

这些字段位于return对象中。如果将整个$context.source对象传递给lambda,则可以访问$context

中的那些字段