Использование цикла VTL #foreach для массива объектов, не возвращающих значения - PullRequest
0 голосов
/ 28 декабря 2018

Я использую AWS API Gateway в качестве спокойной конечной точки API, где я затем передаю записи в поток Kinesis, а затем в 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 показывают из обработки в лямбда-функции.Некоторые данные отображаются, но массив объектов readList не заполняется правильно, он просто отображается как пустой.У меня есть ощущение, что это как-то связано с циклом 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": ""
    }]
}

В лямбда-функции нет ничего особенного.Для тестирования он просто записывает содержимое сообщения на консоль, используя пример кода, предоставленный AWS.

Если у кого-то есть какие-либо идеи или полезные ссылки, это будет очень полезно.Спасибо за ваше время.

1 Ответ

0 голосов
/ 02 января 2019

Ну, у меня все получилось.Это было связано с шаблоном.

{
    "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, а закрывающая скобка для массива readList идет после #end для этого цикла foreach.

Должно быть, я действительно прошел через это, чтобы пропустить эти глупые ошибки.

...