我有一个API网关,它扫描DynamoDB表。我想在我的请求体中传递LastEvaluatedKey
;如果我传递了一个LastEvaluatedKey
,那么一切都正常了,我得到了一个带有预期数据的响应——所以我已经完成了一半。
但是,当然,我第一次向API发送请求时LastEvaluatedKey
将不存在,因此映射模板中需要LastEvaluatedKey
的ExclusiveStartKey
必须是可选的。我已经尝试了几种不同的方法来让它成为可选的,但到目前为止没有任何效果。这是我所拥有的:
#set($hasName = $input.json('$.Name'))
{
"TableName": "MyTable",
#if($hasName && $hasName.length() != 0)
"ExclusiveStartKey": {
"Name": {
"S": $input.json('$.Name')
},
"Date": {
"S": $input.json('$.Date')
}
},#end
"FilterExpression": "begins_with(#dt, :tdt)",
"ExpressionAttributeNames": {
"#dt": "Date"
},
"ExpressionAttributeValues": {
":tdt": {
"S": "$input.params('date')"
}
}
}
正如我所说,当我do在我的请求体中传递LastEvaluatedKey
时,上述方法有效,但当我不传递时,我会得到错误:
{
"__type": "com.amazon.coral.validate#ValidationException",
"message": "The provided starting key is invalid: One or more parameter values were invalid: An AttributeValue may not contain an empty string"
}
人们仍然期待LastEvaluatedKey
我也试过把Name
和Date
包装在#if
里面,但一点运气都没有。我从其他答案中获得了灵感,比如:这个和这个,但没有运气。
在我的示例中,cursor
是LastEvaluatedKey
:
#set($hasCursor = $input.params('cursor') != "")
{
"TableName": "my-table"
#if($hasCursor) "ExclusiveStartKey":$util.base64Decode("$input.params('cursor')")
#end
}
它只是检查cursor
是否作为查询参数传递(如/my/api?cursor=myencodedlastevaluatedkey
(,如果是,则只将ExclusiveStartKey
添加到请求中。
如果您事先知道两个键都是字符串类型,那么您可以执行:
#set($Name = $input.params('Name'))
#set($Date = $input.params('Date'))
{
#if($Name != '' && $Date != '')
"ExclusiveStartKey": {
"Name": {
"S": "$Name"
},
"Date": {
"S": "$Date"
}
},
#end
#if($Date != '')
"FilterExpression": "begins_with(#dt, :tdt)",
"ExpressionAttributeNames": {
"#dt": "Date"
},
"ExpressionAttributeValues": {
":tdt": {
"S": "$Date"
}
}
},
#end
"TableName": "MyTable"
}
这使得过滤器是可选的,仅当Date
作为参数传递时