AppSync 查询解析器:是不是需要 expressionNames 和 expressionValues?
Posted
技术标签:
【中文标题】AppSync 查询解析器:是不是需要 expressionNames 和 expressionValues?【英文标题】:AppSync query resolver: are expressionNames and expressionValues necessary?AppSync 查询解析器:是否需要 expressionNames 和 expressionValues? 【发布时间】:2019-06-13 15:13:12 【问题描述】:https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-query
AppSync 文档说 expressionNames
和 expressionValues
是可选字段,但它们始终由代码生成填充。第一个问题,在使用 DynamoDB 时是否应该将它们作为最佳实践包含在内?如果有,为什么?
用于分区键查询的 AppSync 解析器:
"version": "2017-02-28",
"operation": "Query",
"query":
"expression": "#partitionKey = :partitionKey",
"expressionNames":
"#partitionKey": "partitionKey"
,
"expressionValues":
":partitionKey":
"S": "$ctx.args.partitionKey"
第二个问题,上面代码中expression
字段的外行翻译到底是什么?该语句究竟是告诉 DynamoDB 做什么? "expression": "#partitionKey = :partitionKey"
中的#
有什么用,表达式名称和值是否只是格式化保护措施?
【问题讨论】:
【参考方案1】:我先回答你的第二个问题:
表达式名称
expressionNames
用于插值。这意味着在插值之后,这个过滤器表达式对象:
"expression": "#partitionKey = :value",
"expressionNames":
"#partitionKey": "id"
将转换为:
"expression": "id = :value",
#partitionKey
充当您的列名称 id
的占位符。 '#'
恰好是分隔符。
但是为什么呢?
expressionNames
是必需的,因为某些 keywords are reserved by DynamoDB,意味着您不能在 DynamoDB 表达式中使用这些词。
表达式值
当您需要比较 DynamoDB 表达式中的任何内容时,您还需要使用占位符替代实际值,因为 DynamoDB 类型化值是一个复杂对象。
在下面的例子中:
"expression": "myKey = :partitionKey",
"expressionValues":
":partitionKey":
"S": "123"
:partitionKey
是复数值的占位符
"S": "123"
':'
是告诉 DynamoDB 在替换时使用 expressionValues
映射的不同分隔符。
为什么代码生成总是使用expressionNames
和expressionValues
?
代码生成逻辑始终使用expressionNames
和expressionValues
会更简单,因为不需要为保留/非保留 DynamoDB 字设置两个代码路径。使用expressionNames
将始终防止冲突!
【讨论】:
嘿蒂努。你能在这里帮忙吗?:***.com/questions/60929031/…以上是关于AppSync 查询解析器:是不是需要 expressionNames 和 expressionValues?的主要内容,如果未能解决你的问题,请参考以下文章
AWS AppSync Lambda 解析器获取查询返回类型