AWS AppSync Lambda 解析器字段

Posted

技术标签:

【中文标题】AWS AppSync Lambda 解析器字段【英文标题】:AWS AppSync Lambda resolver fields 【发布时间】:2019-04-16 02:35:21 【问题描述】:

我有以下疑问:

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

有什么方法可以让我在 lambda 中获得 field1field2 吗?例如,只查询 mysql 中的那些字段,而不是获取所有这些字段,以便稍后被 AppSync 丢弃。

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

谢谢, 米海

【问题讨论】:

您的响应映​​射模板的外观。你也看过这个教程吗? docs.aws.amazon.com/appsync/latest/devguide/… 我说的是请求,而不是响应。响应模板用于修改响应,我有兴趣获取请求中的字段。 【参考方案1】:

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

Info 对象的布局:


    "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)
    

注意:如果您尝试传递 selectionSetList,那么您需要专门引用它(如上例所示)。如果 info 对象直接以 $utils.toJson($ctx.info) 之类的形式传入,则该列表将不可用。

【讨论】:

【参考方案2】:

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

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

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

n.b.这并不少见,例如Apollo doesn't by default either。

【讨论】:

是的,我明白了。考虑过使用字段解析器,但这意味着另一个 lambda,即使它是同一个,它也是另一个启动的 lambda。我想只用一个功能来完成这项工作。谢谢 这听起来确实是一个有用的功能——虽然我猜这是因为字段可以嵌套,有参数,这样它是一个相当复杂的自定义对象来表达。 Appsync 的这种疏忽非常令人沮丧。例如,我可以想象标量字段是计算出来的,如果不要求它们,我想避免计算。对这些字段使用字段级解析器意味着到数据源(例如数据库)的额外往返行程以及源/父结果的序列化以及子查询解析器中的后续反序列化。如果能够访问给定查询或字段解析器下方的整个查询树,那就太好了,因此 lambda 可以选择优化数据库访问/结果计算。例如,lacinia 确实【参考方案3】:

这些字段位于 $context.source 对象中。如果您将整个 $context 对象传递给您的 lambda,您将能够访问 event.source 中的这些字段

【讨论】:

试过了,没有。只有参数在那里

以上是关于AWS AppSync Lambda 解析器字段的主要内容,如果未能解决你的问题,请参考以下文章

DotNet Core:AWS Lambda 解析器

AWS appsync 查询解析器

在 aws appsync 解析器中添加额外字段

在aws appsync解析器中添加额外字段

AWS Appsync 一个 dynamodb 解析器中的多个 dynamodb 请求

让 DynamoDB Stream Lambda 函数调用 AWS AppSync 突变