AppSync优化:使用单个解析器批量解析多个GraphQL字段
解决方案
有两种常用方法可以实现单次调用Lambda获取三个Cognito字段,避免重复调用:
方法一:为User类型绑定字段级解析器(推荐)
AppSync支持为整个User类型绑定解析器,而非单个字段。当查询请求包含emailAddress、emailAddressVerified或CreateDate任意一个字段时,只会触发一次Lambda调用,一次性获取三个字段并映射到对应位置:
- 在AppSync控制台中找到
User类型,为其添加解析器,数据源选择你已有的Cognito相关Lambda。 - 请求模板:传递父节点(即DynamoDB返回的用户数据)中的用户标识(比如
$ctx.source.id,需根据实际存储的用户ID字段调整),用于Lambda调用Cognito获取信息:
{ "version": "2017-02-28", "operation": "Invoke", "payload": { "userId": "$ctx.source.id" } }
- 响应模板:将Lambda返回的结果映射到
User类型的对应字段:
{ "emailAddress": $util.toJson($ctx.result.emailAddress), "emailAddressVerified": $util.toJson($ctx.result.emailAddressVerified), "CreateDate": $util.toJson($ctx.result.CreateDate) }
这样,无论查询时请求这三个字段中的几个,都只会触发一次Lambda调用。
方法二:使用Pipeline Resolver合并查询结果
如果希望在getUser查询阶段就一次性获取所有字段,可以用流水线解析器先查DynamoDB,再调用Lambda,最后合并结果:
- 创建两个解析器函数:
- 函数1:调用DynamoDB获取
DDBpk、DDBsk、DDBproperty1、DDBproperty2四个字段。 - 函数2:调用Lambda获取Cognito的三个字段。
- 函数1:调用DynamoDB获取
- 为
getUser查询创建流水线解析器,按顺序执行上述两个函数。 - 在流水线的响应模板中,合并两个函数的结果:
{ "DDBpk": $util.toJson($ctx.steps[0].result.DDBpk), "DDBsk": $util.toJson($ctx.steps[0].result.DDBsk), "DDBproperty1": $util.toJson($ctx.steps[0].result.DDBproperty1), "DDBproperty2": $util.toJson($ctx.steps[0].result.DDBproperty2), "emailAddress": $util.toJson($ctx.steps[1].result.emailAddress), "emailAddressVerified": $util.toJson($ctx.steps[1].result.emailAddressVerified), "CreateDate": $util.toJson($ctx.steps[1].result.CreateDate) }
这种方式的缺点是,即使查询不包含Cognito字段,也会触发Lambda调用,可能造成不必要的资源消耗。
内容的提问来源于stack exchange,提问作者Mercury
相关产品推荐
相关产品推荐

