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 文档说 expressionNamesexpressionValues 是可选字段,但它们始终由代码生成填充。第一个问题,在使用 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 映射的不同分隔符。

为什么代码生成总是使用expressionNamesexpressionValues

代码生成逻辑始终使用expressionNamesexpressionValues 会更简单,因为不需要为保留/非保留 DynamoDB 字设置两个代码路径。使用expressionNames 将始终防止冲突!

【讨论】:

嘿蒂努。你能在这里帮忙吗?:***.com/questions/60929031/…

以上是关于AppSync 查询解析器:是不是需要 expressionNames 和 expressionValues?的主要内容,如果未能解决你的问题,请参考以下文章

AWS appsync 查询解析器

AWS AppSync Lambda 解析器获取查询返回类型

AWS AppSync Lambda 解析器字段

Appsync 中的字段解析器使用与参数相同的查询输出

如何使用 Aws AppSync 将 JWT 令牌(或任何其他变量)从父解析器传递给子解析器

Dynamo DB 中的 AWS AppSync 简单 graphql 解析器无法正常工作,这让我发疯