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 中获得 field1
和 field2
吗?例如,只查询 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(字段或其他)。
我能给你的唯一两个“选项”是:
设计您的查询架构,以便您可以更精确地获取数据(例如getThingFromTableA
和 getThingFromTableB
而不仅仅是 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 解析器字段的主要内容,如果未能解决你的问题,请参考以下文章