Лямбда-функция блокирует значения DynamoDB - PullRequest
0 голосов
/ 05 октября 2018

В течение 1-минутного цикла я получаю 2 события (сообщения mqtt), которые входят в лямбда-функцию (.js).

Событие № 1:

{
  "ID": 789,
  "Value1": 1,
  "Value2: 2,
}

Событие № 2:

{
  "ID": 789,
  "Value3: 3
}

Проблема: В настоящий момент мой Код сначала помещает Событие № 1 в строку в БД.Когда приходит событие № 2, оно перезаписывает и ЗАДЕРЖИВАЕТ Value1 и Value2, поэтому через минуту я получаю только Value3 в БД.

Вопрос: Как я могу отредактировать код такэто просто заполняет значения, которые являются пустыми в строке DynamoDB?Я экспериментировал с ConditionExpression, но безуспешно.

console.log('Loading function');
var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB.DocumentClient();
var table = "TABLE";

exports.handler = function(event, context) {
    console.log('Received event:', JSON.stringify(event, null, 2));
   var params = {
    TableName:table,
    Item:{
        "ID": event.ID,
        "Value1": event.Value1,
        "Value2": event.Value2,
        "Value3": event.Value3,
        "TimeStamp": String(Math.round(Date.now() / 60000) * 60000)
        },    
    };

    console.log("Adding...");
    dynamo.put(params, function(err, data) {
        if (err) {
            console.error("Unable to add. Error JSON:", JSON.stringify(err, null, 2));
            context.fail();
        } else {
            console.log("Added:", JSON.stringify(data, null, 2));
            context.succeed();
        }
    });
}

Обновление :

Отредактировал код с помощью «Dynamo.update» вместо «Dynamo».положил".Теперь код не может создать новую строку.Журнал JSON выдает ошибку отсутствующего ключа.

console.log('Loading function');
var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB.DocumentClient();
var table = "TABLE";

exports.handler = function(event, context) {
    console.log('Received event:', JSON.stringify(event, null, 2));
   var params = {
    TableName:table,
    Item:{
        "ID": event.ID,
        "Value1": event.Value1,
        "Value2": event.Value2,
        "Value3": event.Value3,
        "TimeStamp": String(Math.round(Date.now() / 60000) * 60000)
        },    
    };

    console.log("Adding...");
    dynamo.update(params, function(err, data) {
        if (err) {
            console.error("Unable to add. Error JSON:", JSON.stringify(err, null, 2));
            context.fail();
        } else {
            console.log("Added:", JSON.stringify(data, null, 2));
            context.succeed();
        }
    });
}

TABLE в конфигурации DynamoDB:

Table name  TABLE
Primary partition key   TimeStamp (String)
Primary sort key    -

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Вы можете обновить то, что вы получите Event Object.Таким образом, вы должны динамический запрос для этого.

Пример динамического запроса на обновление по идентификатору

let event = {
    ID : '123',
    Value1 : 'qwe',
    Value2 : 'qweqwe'
  };
  let id = event.ID;
  delete event.ID;
  let expression = 'SET ';
  let expressionAttribute = {};

  for (var key in event){
        console.log(key)
        expression += key + ' = :' + key + ', ';
        expressionAttribute[':'+key] = _.get(event,key);
  }

  expression = expression.substr(0, expression.length-2);

  let queryParams = {
    TableName: 'table',
    Key: {
      'ID': id
    },
    UpdateExpression: expression,
    ExpressionAttributeValues: expressionAttribute,
    ReturnValues: 'UPDATED_NEW'
  };

  documentClient.update(queryParams, function (err, data) {
    if (err) {
      console.log('failure:update data from Dynamo error', err);
    } else {
      console.log('success:update data from Dynamo data', data);
    }
  });

Для этого примера, когда выlog expression и expressionAttribute

выражение: SET Value1 =: Value1, Value2 =: Value2

expressionAttribute: {': Value1': 'qwe', ': Value2 ':' qweqwe '}

0 голосов
/ 05 октября 2018

Из документации :

putItem (params = {}, обратный вызов) ⇒ AWS.Request

Создает новыйэлемент или заменяет старый элемент новым.


updateItem (params = {}, обратный вызов) ⇒ AWS.Request

Редактирует атрибуты существующего элемента или добавляет новый элемент в таблицу, если он еще не существует.

Поэтому вам необходимо изменить код, чтобы использовать updateItem вместо putItem.

...