在不返回值的对象数组上使用 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 之后。

我一定是真的忘记了那些愚蠢的错误。