AWS AppSync Lambda 解析器获取查询返回类型
Posted
技术标签:
【中文标题】AWS AppSync Lambda 解析器获取查询返回类型【英文标题】:AWS AppSync Lambda Resolver Get Query Return Type 【发布时间】:2021-04-21 15:40:30 【问题描述】:在 AWS AppSync 中,我有一个 Lambda 解析器。解析器处理多个查询,例如getUser、getUsers、getClient 等。Lambda 函数如何获取 AppSync GraphQL 架构中定义的查询返回类型?
返回类型在 AppSync GraphQL 架构查询部分定义:
type Query
getClient(_id: ID!): Client
getUser(_id: ID!): User
getUsers(): UserConnection
对于查询 getUser,lambda 事件变量包含以下内容:
"info":
"parentTypeName": "Query",
"selectionSetList": [
"_id",
"email"
],
"selectionSetGraphQL": "\n _id\n email\n",
"fieldName": "getUser",
"variables":
"id": "5c42109b2eb8ed82c8862532"
,
"stash":
使用 AWS 开发工具包,我可以调用 AppSync API 方法 getIntrospectionSchema,但它不返回任何查询或突变——只返回所有类型的数组。
我也可以调用getResolver方法,但它不返回字段返回类型。
var appsync = new AWS.AppSync();
var params =
apiId: 'xxxxx',
fieldName: 'getUser',
typeName: 'Query',
;
const data = await appsync.getResolver(params).promise();
Response:
dataSourceName:'myLambdaDatasource'
fieldName:'getUser'
kind:'UNIT'
requestMappingTemplate:null
resolverArn:'arn:.../types/Query/resolvers/getUser'
responseMappingTemplate:null
typeName:'Query'
【问题讨论】:
【参考方案1】:作为一种解决方法(并且因为我使用 AWS CDK 创建 AppSync API),我可以通过管道解析器请求映射模板将变量注入数据源 Lambda 函数。这并不理想,因为我们需要模拟发送到直接 Lambda 解析器(可能会改变)的变量。目前,这个 VTL 有效:$util.toJson($ctx)
api.addQuery(`get$objectTypeName`, new ResolvableField(
returnType: objectType.attribute(),
args: id: appsync.GraphqlType.id( isRequired: true ) ,
dataSource,
pipelineConfig: [],
requestMappingTemplate: appsync.MappingTemplate.fromString(`
$util.qr($ctx.stash.put("myVariable", "myValue"))
"version" : "2017-02-28",
"operation": "Invoke",
"payload": $util.toJson($ctx)
`)
));
变量在 Lambda 事件参数中可用,即 event.stash.myVariable
"stash":
"myVariable": "myValue"
【讨论】:
以上是关于AWS AppSync Lambda 解析器获取查询返回类型的主要内容,如果未能解决你的问题,请参考以下文章
AWS Appsync 一个 dynamodb 解析器中的多个 dynamodb 请求