Использование aws-lambda для вставки данных в DynamoDB

#amazon-web-services #aws-lambda #amazon-dynamodb

#amazon-веб-сервисы #aws-lambda #amazon-dynamodb

Вопрос:

При попытке поместить новую запись в таблицу не выполняется функция put. К сожалению, раньше это работало, а теперь по каким-то причинам не работает. allValues представляет собой массив и возвращает данные полностью. Всякий раз, когда вы пытаетесь вызвать SaveData, он выполняет все, кроме функции put.

По какой-то причине я пробовал это несколько раз, и все работало нормально, но внезапно запись больше не помещается. Пытался поиграть, но, похоже, не могу найти проблему? Может быть вызвано асинхронностью?

 //Amazon sdk
let AWS = require("aws-sdk");
let db = require('database');
//Amazon config
AWS.config.update({
    region: "us-east-1",
    endpoint: "https://dynamodb.us-east-1.amazonaws.com"
});

//DynamoDb client
var docClient = new AWS.DynamoDB.DocumentClient();

//Axios will handle HTTP requests to web service
let axios = require ('axios');

//The ID of the student's data that I will download
let requestID= '*********';

//URL where student data is available
let url = '*************************';

exports.handler = async (event) => {
        //Get synthetic data
        let allValues = (await axios.get(url   requestID)).data.target;
        let allStart = (await axios.get(url   requestID)).data.start;

        for(let i = 0; i < allValues.length; i  ){
            //db.saveData(i, allValues[i], allStart);
        }
        db.saveData();
};
  

и мой database.js

 et AWS = require("aws-sdk");

//Create new DocumentClient
let documentClient = new AWS.DynamoDB.DocumentClient();

//Returns all of the connection IDs
//module.exports.saveData = async (sId, sValue, sTime) => {
module.exports.saveData = async () => {
     let params = {
        TableName: "SynData",
        Item:{
            "synId": 66,
            "synValue": 1579.21,
            "synTime": "2019-01-01"
        }
    };
    //return documentClient.put(params).promise();
    documentClient.put(params, function(err, data) {
    if (err) {
        console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("Added item:", JSON.stringify(data, null, 2));
    }
});
};

  

В журналах не отображается никакого возврата для функции put.

Ответ №1:

saveData() является async , поэтому возвращает обещание. Вам нужно await использовать это. Кроме того, я не понимаю, почему вы отказались от вызова .promise() . Использование обратных вызовов устарело и стало гораздо более запутанным.

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

 module.exports.saveData = async () => {
     let params = {
        TableName: "SynData",
        Item:{
            "synId": 66,
            "synValue": 1579.21,
            "synTime": "2019-01-01"
        }
    };
    return await documentClient.put(params).promise();
};
  

На вашем клиенте просто ожидайте сохранения данных():

 for(let i = 0; i < allValues.length; i  ){
   await db.saveData(i, allValues[i], allStart);
}