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 查询解析器

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

在子解析器 AWS AppSync 中获取父对象

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

DotNet Core:AWS Lambda 解析器

我可以在Aws AppSync解析器映射模板中对用户输入进行消毒吗?