CDK V2中如何为AppSync DynamoDB查询Resolver配置ExpressionValues?
解决CDK V2 AppSync Resolver中设置expressionValues的问题
我懂你的痛点——CDK把很多AppSync的细节封装成便捷方法后,反而让人找不到对应CloudFormation里expressionValues的配置入口。针对你的需求,这里有两种靠谱的实现方式,完全匹配你原来的CloudFormation模板功能:
方法1:使用CDK封装的dynamoDbQuery便捷方法
CDK的dynamoDbQuery方法其实支持通过第三个参数(QueryOptions)传入表达式值。另外注意修正typeName——你原来的CloudFormation里是把Resolver挂载到Items类型上,但之前的CDK代码写的是Query,这会导致Resolver挂载位置错误。
完整代码如下:
import * as appsync from 'aws-cdk-lib/aws-appsync'; // ... 其他相关代码(比如定义tableDataSource、rGraphQLApi等) ... const resolver = tableDataSource.createResolver({ typeName: 'Items', // 与CloudFormation中的TypeName保持一致 fieldName: 'getItems', requestMappingTemplate: appsync.MappingTemplate.dynamoDbQuery( appsync.KeyCondition.eq('itemId', ':itemId'), 'itemId-index', { // 这里对应CloudFormation里的expressionValues expressionValues: { ':itemId': appsync.util.dynamodb.toDynamoDB(appsync.util.context.source('itemId')) } } ), responseMappingTemplate: appsync.MappingTemplate.dynamoDbResultList(), });
这里appsync.util.context.source('itemId')会生成对应VTL中的${context.source.itemId},appsync.util.dynamodb.toDynamoDB()则会把值转换成DynamoDB需要的格式(比如字符串类型的{ "S": "xxx" })。
方法2:直接复用原始VTL模板
如果你更习惯完全复刻CloudFormation的实现,不想依赖CDK的封装,可以直接用MappingTemplate.fromString()传入原始的VTL代码,这样和你原来的配置完全一致,没有学习成本:
import * as appsync from 'aws-cdk-lib/aws-appsync'; // ... 其他相关代码 ... const resolver = tableDataSource.createResolver({ typeName: 'Items', fieldName: 'getItems', requestMappingTemplate: appsync.MappingTemplate.fromString(` { "version" : "2017-02-28", "operation" : "Query", "query" : { "expression": "itemId = :itemId", "expressionValues" : { ":itemId" : { "S" : "${context.source.itemId}" } } }, "index": "itemId-index" } `), responseMappingTemplate: appsync.MappingTemplate.fromString('$util.toJson($context.result.items)'), });
两种方法都能实现你要的功能,你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者Andrew Allison
相关产品推荐
相关产品推荐

