какой шаблон API я могу получить правильный объект JSON для хранения в Dynamodb - PullRequest
2 голосов
/ 24 марта 2019

В настоящее время я работаю над проектом по сохранению данных http, записанных в формате Urlen, с устройства и их хранения в Dynamodb.Но я не могу получить правильный формат объекта в Dynamodb, все, что я могу получить, это как

Dynamodb data

data shown in Dynamodb

и моя лямбда-функция для передачи данных выглядит следующим образом:

exports.handler = function(event, context,callback) {
  var input = querystring.parse(event.body);
  var inputttt=input.data;
  var params={
    Item:{
      date:Date.now(),
      message:event.body,
      ID:inputttt,
      a:{"id":"123456","data":[{"mac":"1231"}]}
    },    
  TableName:'wifi'
  };

Кроме того, мой API использует application / x-www-form-urlencoded и шаблон

{
"body": $input.json('$')
}

Что мне нужно в Dynamodb, это что-то вроде стандартного объекта JSON, подобного этому

desired format

Я не могу ничего изменить вклиентское устройство, все, что я могу изменить, - это загружаемый URL, который является конечной точкой API.

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Вам не нужно указывать типы, если вы используете API DocumentClient вместо API DynamoDB.

DocumentClient - это API, который абстрагирует типы при манипулировании элементами в DynamoDB,упрощая чтение и запись элементов из него.

Предполагая, что в какой-то момент вы вызываете DynamoDB.putItem(params), вам нужно заменить его на API DocumentClient и использовать вместо него метод put.

Ваш код будет таким простым:

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
    await docClient.put({
        Item: {
            date: Date.now(),
            message: JSON.parse(event.body),
            ID: 'some-random-id-you-choose',
            a: { "id": "123456", "data": [{ "mac": "1231" }] }
        },
        TableName: 'wifi'
    }).promise()
}

Обратите внимание, что я использую async / await , так что вам не нужно использовать ни обратный вызов Lambda, ниОбратные вызовы DynamoDB больше.

Все операции API для DocumentClient доступны на официальных документах

0 голосов
/ 24 марта 2019

Несмотря на то, что DynamoDB является хранилищем документов без схемы, требуется, чтобы вы объявили тип данных, которые хранятся в полях элемента.

Ваш код должен выглядеть следующим образом:

const aws = require('aws-sdk');
const ddb = new aws.DynamoDB();

const Item = {
    date: {N: Date.now()},
    message: {S: event.body},
    ID: {S: inputttt},
    a: {M: {
        "id":{S: "123456"},
        "data":{L: [ {M: {"mac":{S: "1231"}}} ]}
    }}

};

const TableName = 'wifi';

ddb.putItem({Item, TableName}, (err, data) => { ... })

В приведенном выше коде каждое свойство Item является объектом, отображающим тип в значение.Например, дата - это числовой тип с {N: Date.now};a - это объект или карта с {M: {"id" ... }}, а id - строка с {S: '123456'}.

Приведенный выше код делает некоторые предположения о типах.Вы должны убедиться, что выбранные мной типы соответствуют вашим данным.(например, предполагается, что event.body и inputttt являются строками.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...