AWS CDK结合AppSync构建DynamoDB查询Resolver的疑问
关于AppSync中
createResolver构建单条DynamoDB数据查询的问题解答 1. createResolver配置项含义
typeName:指定当前Resolver关联的GraphQL根类型,这里设为Query表示这是一个查询操作(对应GraphQL规范中的查询根类型)。fieldName:对应GraphQL Schema里Query类型下的具体字段名。注意你这里写的addEmployerAccount不符合查询场景,应该改成getEmployerAccount这类语义明确的查询字段名。requestMappingTemplate:负责将GraphQL请求转换为DynamoDB可执行的操作指令,这里用dynamoDbGetItem表示要执行DynamoDB的GetItem(获取单条数据)操作。responseMappingTemplate:负责将DynamoDB返回的结果转换为符合GraphQL Schema定义的响应格式。
2. responseMappingTemplate配置与报错问题
你当前代码标红报错的直接原因是requestMappingTemplate的括号没有闭合(最后少了一个)),先修复这个语法错误。
对于获取单条数据的场景,appsync.MappingTemplate.dynamoDbResultItem()是正确的配置,它会把DynamoDB返回的单条Item直接映射为GraphQL响应。如果需要处理数据不存在的情况,也可以自定义模板,比如:
appsync.MappingTemplate.fromString(` $util.toJson($ctx.result) `)
但基础场景下用dynamoDbResultItem()完全足够。
3. requestMappingTemplate的正确性修正
你当前的写法存在两处问题:
PrimaryKey.partition("id").auto()是自动生成主键值,这是写入操作的逻辑,而你是要根据传入的id查询,应该改成.is(appsync.ctx.args.id),表示用GraphQL请求参数里的id作为分区键值。appsync.Values.projecting("query")的用法有误,projecting需要传入字段数组(比如["id", "companyName"])来指定要返回的字段,如果需要返回所有字段,可以直接省略这个参数。
修正后的requestMappingTemplate示例:
requestMappingTemplate: appsync.MappingTemplate.dynamoDbGetItem( appsync.PrimaryKey.partition("id").is(appsync.ctx.args.id) // 若需指定返回字段,添加:, appsync.Values.projecting(["id", "companyName"]) ),
另外记得把fieldName改成getEmployerAccount,保证语义和操作匹配。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

