在不返回值的对象数组上使用 VTL #foreach 循环
Using a VTL #foreach loop on array of objects not returning values
我使用 AWS API 网关作为 restful API 端点,然后我将记录传递到 Kinesis 流,然后传递到 Lambda。但是似乎有些数据没有到达Lambda函数。
我一直在广泛地寻找一个例子或接近我正在寻找的东西但没有运气。
一条设备消息看起来像下面这样,并且可以有多个消息,因此它在一个数组中。
[{
"deviceId": "00000000001",
"deviceType": "device",
"receivedTs": 1539234374000,
"readingList": [{
"channelId": 13,
"type": "temperature",
"value": 25.3,
"unit": "°C"
},{
"channelId": 12,
"type": "humidity",
"value": 3.65,
"unit": "V",
"label": "primary-battery"
}]
}]
我目前使用的传出映射模板如下:
{
"StreamName": "my-stream",
"Records": [
#foreach($elem in $input.path('$'))
#set($event = "{
""deviceId"": $elem.deviceId
""deviceType"": $elem.deviceType,
""receivedTs"": $elem.receivedTs,
""readingList"": [
#foreach($reading in $elem.readingList)
{
""channelId"": $reading.channelId,
""type"": ""$reading.type"",
""value"": $reading.value,
""unit"": ""$reading.unit"",
""label"": ""$reading.label""
}]
#if($foreach.hasNext),#end
#end
}")
{
"Data": "$util.base64Encode($event)",
"PartitionKey": "$elem.deviceType"
}#if($foreach.hasNext),#end
#end
]
}
以下是我的 CloudWatch 日志显示的来自 lambda 函数内处理的内容。正在显示一些数据,但未正确填写对象的 readingList 数组,它只是显示为空。我感觉这与映射模板中的 foreach 循环有关,但我似乎无法弄清楚是什么。
Beginning to process all 1 records...
Event Name: aws:kinesis:record
Getting record contents.
Record contents: {
"deviceId": "00000000001",
"deviceType": "device",
"receivedTs": "1539234374000",
"readingList": [{
"channelId": "",
"type": "",
"value": "",
"unit": "",
"label": ""
}]
}
lambda 函数没有什么特别之处。为了进行测试,它只是使用 AWS 提供的示例代码将消息内容写入控制台。
如果有人有任何想法或一些有用的链接,将不胜感激。谢谢你的时间。
好吧,我让它工作了。跟模板有关。
{
"StreamName": "my-stream",
"Records": [
#foreach($elem in $input.path('$'))
#set($event = "{
""deviceId"": $elem.deviceId,
""deviceType"": $elem.deviceType,
""receivedTs"": $elem.receivedTs,
""readingList"": [
#foreach($reading in $elem.readingList)
{
""channelId"": $reading.channelId,
""type"": ""$reading.type"",
""value"": $reading.value,
""unit"": ""$reading.unit"",
""label"": ""$reading.label""
}
#if($foreach.hasNext),#end
#end
]
}")
{
"Data": "$util.base64Encode($event)",
"PartitionKey": "$elem.deviceType"
}#if($foreach.hasNext),#end
#end
]
}
首先,我在 $elem.deviceId 后遗漏了一个逗号,并且 readingList 数组的右括号位于该 foreach 循环的 #end 之后。
我一定是真的忘记了那些愚蠢的错误。
我使用 AWS API 网关作为 restful API 端点,然后我将记录传递到 Kinesis 流,然后传递到 Lambda。但是似乎有些数据没有到达Lambda函数。
我一直在广泛地寻找一个例子或接近我正在寻找的东西但没有运气。
一条设备消息看起来像下面这样,并且可以有多个消息,因此它在一个数组中。
[{
"deviceId": "00000000001",
"deviceType": "device",
"receivedTs": 1539234374000,
"readingList": [{
"channelId": 13,
"type": "temperature",
"value": 25.3,
"unit": "°C"
},{
"channelId": 12,
"type": "humidity",
"value": 3.65,
"unit": "V",
"label": "primary-battery"
}]
}]
我目前使用的传出映射模板如下:
{
"StreamName": "my-stream",
"Records": [
#foreach($elem in $input.path('$'))
#set($event = "{
""deviceId"": $elem.deviceId
""deviceType"": $elem.deviceType,
""receivedTs"": $elem.receivedTs,
""readingList"": [
#foreach($reading in $elem.readingList)
{
""channelId"": $reading.channelId,
""type"": ""$reading.type"",
""value"": $reading.value,
""unit"": ""$reading.unit"",
""label"": ""$reading.label""
}]
#if($foreach.hasNext),#end
#end
}")
{
"Data": "$util.base64Encode($event)",
"PartitionKey": "$elem.deviceType"
}#if($foreach.hasNext),#end
#end
]
}
以下是我的 CloudWatch 日志显示的来自 lambda 函数内处理的内容。正在显示一些数据,但未正确填写对象的 readingList 数组,它只是显示为空。我感觉这与映射模板中的 foreach 循环有关,但我似乎无法弄清楚是什么。
Beginning to process all 1 records...
Event Name: aws:kinesis:record
Getting record contents.
Record contents: {
"deviceId": "00000000001",
"deviceType": "device",
"receivedTs": "1539234374000",
"readingList": [{
"channelId": "",
"type": "",
"value": "",
"unit": "",
"label": ""
}]
}
lambda 函数没有什么特别之处。为了进行测试,它只是使用 AWS 提供的示例代码将消息内容写入控制台。
如果有人有任何想法或一些有用的链接,将不胜感激。谢谢你的时间。
好吧,我让它工作了。跟模板有关。
{
"StreamName": "my-stream",
"Records": [
#foreach($elem in $input.path('$'))
#set($event = "{
""deviceId"": $elem.deviceId,
""deviceType"": $elem.deviceType,
""receivedTs"": $elem.receivedTs,
""readingList"": [
#foreach($reading in $elem.readingList)
{
""channelId"": $reading.channelId,
""type"": ""$reading.type"",
""value"": $reading.value,
""unit"": ""$reading.unit"",
""label"": ""$reading.label""
}
#if($foreach.hasNext),#end
#end
]
}")
{
"Data": "$util.base64Encode($event)",
"PartitionKey": "$elem.deviceType"
}#if($foreach.hasNext),#end
#end
]
}
首先,我在 $elem.deviceId 后遗漏了一个逗号,并且 readingList 数组的右括号位于该 foreach 循环的 #end 之后。
我一定是真的忘记了那些愚蠢的错误。