положить массив объекта в DynamoDB - PullRequest
0 голосов
/ 19 января 2020

У меня есть API, который получает это JSON:

{
    "name": "Mar/19",
    "month": "3",
    "year": "2019",
    "credit": [
        {
            "name": "Income salary",
            "value": "6500"
        }       
    ],
    "debit": [
        {
            "name": "Rent",
            "value": "2500"
        }       
    ]
}

И мой бэкэнд работает на AWS и должен поместить эту информацию в таблицу DynamoDB. Лямбда-функция выглядит следующим образом:

const params = {
    Item: {
        "id": {
            S: ""+Math.random()
        },
        "name": {
            S: event.name
        },
        "month": {
            N: event.month
        },
        "year": {
            N: event.year
        },           
    },
    TableName: "billing-circle"
};
dynamodb.putItem(params, function(err, data){
    if(err) {
        console.log(err);
        callback(err);
    } else {
        console.log(data);
        callback(null, data);
    }
});

API имеет шаблон сопоставления, объявленный в запросе на интеграцию, и выглядит следующим образом:

#set($inputRoot = $input.path('$'))
{
  "name" : "$inputRoot.name",
  "month" : "$inputRoot.month",
  "year" : "$inputRoot.year",
  "credit" : [
        #foreach($elem in $inputRoot.credit)
        {
            "name" : "$elem.name",
            "value" : "$elem.value"
        } 
        #if($foreach.hasNext),#end
    #end
    ],
    "debit" : [
        #foreach($elemDebit in $inputRoot.debit)
        {
            "name" : "$elemDebit.name",
            "value" : "$elemDebit.value",
            "status" : "$elemDebit.status"
        } 
        #if($foreach.hasNext),#end
    #end
    ]
}

Я пытаюсь вызвать API из Почтальона, но Я получил эту ошибку:

{
    "errorType": "ValidationException",
    "errorMessage": "Supplied AttributeValue is empty, must contain exactly one of the supported datatypes",
    "trace": [
        "ValidationException: Supplied AttributeValue is empty, must contain exactly one of the supported datatypes",
        "    at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:51:27)",
        "    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)",
        "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)",
        "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)",
        "    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)",
        "    at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)",
        "    at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10",
        "    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)",
        "    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:685:12)",
        "    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"
    ]
}

Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 20 января 2020

Я нашел решение, но не уверен, что это лучшее решение. Я использую DynamoDB DocumentClient вместо библиотеки стендов DynamoDB. Моя лямбда-функция теперь выглядит так:

const AWS = require('aws-sdk');
//const dynamodb = new AWS.DynamoDB({region: 'sa-east-1', apiVersion: '2012-08-10'});
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {

console.log(event);
var input = {
    "id": ""+Math.random(), "name": event.name, "month": event.month, "year": event.year,
    "credit": event.credit,
    "debit": event.debit
};
console.log("input");
console.log(input);
const params = {
    Item: input,
    // Item: {
    //     "id": {
    //         S: ""+Math.random()
    //     },
    //     "name": {
    //         S: event.name
    //     },
    //     "month": {
    //         N: event.month
    //     },
    //     "year": {
    //         N: event.year
    //     },
    //     "credit": {
    //             "M": {
    //                 "name": {
    //                     S: event.credit.name
    //                 },
    //                 "value": {
    //                     N: event.credit.value
    //                 }                        
    //             }
    //         }
    //     "debit": { L: [{
    //         M: {
    //             "name": {
    //                 S: event.debit.name
    //             },
    //             "value": {
    //                 N: event.debit.value
    //             },
    //             "status": {
    //                 S: event.debit.status
    //             }
    //         }
    //     }] }, },
    TableName: "billing-circle"
};
//dynamodb.putItem(params, function(err, data){
documentClient.put(params, function(err, data){
    if(err) {
        console.log(err);
        callback(err);
    } else {
        console.log(data);
        callback(null, data);
    }
});
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...