访问解析器映射模板中的请求字段
Posted
技术标签:
【中文标题】访问解析器映射模板中的请求字段【英文标题】:Access requested fields in resolver mapping template 【发布时间】:2019-11-15 22:15:01 【问题描述】:例如,当我们请求 GraphQL 查询时,
query GetPost
singlePost(id: 123)
id
title
我们已经在 AWS AppSync 中配置了一个 Lambda 解析器,即请求映射模板,
"version": "2017-02-28",
"operation": "Invoke",
"payload":
"resolve": "singlePost",
"query": $utils.toJson($context.arguments)
允许我们定义传递给 lambda 处理程序的事件对象。
对于上面的示例,我们的 Lambda 处理程序将通过事件 event
调用,其中 event.payload.query.id == 123
等。
根据the docs$context
对象包括,
"arguments" : ... ,
"source" : ... ,
"result" : ... ,
"identity" : ... ,
"request" : ...
也就是说,文档没有提到我可以在哪里访问 GraphQL 查询的请求字段。
对于前一个示例,这些字段将对应于["id", "title"]
。
如果我需要解析一些嵌套属性,例如一个标签数组,一个对象通过昂贵的操作,例如一个 SQL 连接,如果我可以检查这个嵌套属性是否真的被请求,那将是有益的。
这个问题与 How to get requested fields inside GraphQL resolver? 相关,但是,它不同于 GraphQL 实现 graphql-tools
vs AppSync。
【问题讨论】:
【参考方案1】:不幸的是,这实际上不是 AppSync 今天所支持的。不过,这是我们从其他客户那里听到的请求,我将使用这篇文章作为 +1 来确定未来版本的优先级。
【讨论】:
这个功能有更新吗?这将极大地减少我们应用程序中的映射模板膨胀.. 还没有看到任何关于此功能的正在进行的对话。 docs.aws.amazon.com/appsync/latest/devguide/…【参考方案2】:文档已经更新,AWS在上下文中增加了一个新的字段info
,你可以访问字段名称如下:
"version" : "2017-02-28",
"operation" : "Invoke",
"payload":
"resolve": "$ctx.info.fieldName",
"query": $utils.toJson($context.arguments)
您可以参考这里的文档:
https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html#aws-appsync-resolver-context-reference-info
【讨论】:
info.fieldName
是 parent
上要求此解析器解析的字段,而不是原始问题所要求的最终对象上请求的字段名称数组。跨度>
【参考方案3】:
现在有一个 $context.info.selectionSetList
字段,其中包含请求的字段名称。 official docs 提供了一个示例并解释了一些围绕接口和别名的特殊用例。
【讨论】:
注意在context.info
上使用$utils.toJson()
时,selectionSetList
返回的值默认是不序列化的。另见github.com/aws-amplify/amplify-cli/issues/4869以上是关于访问解析器映射模板中的请求字段的主要内容,如果未能解决你的问题,请参考以下文章
Aws Appsync 解析器:如何创建解析器以更新列表映射 (DynaMoDB) 中的项目