NodeJS на AWS Lamdba и DynamoDB - PullRequest
       7

NodeJS на AWS Lamdba и DynamoDB

0 голосов
/ 10 апреля 2020

Я пытаюсь создать функцию Lambda для генерации сценария. js (для использования с диаграммой. JS).

Эти сценарии отправляют запрос к таблице в DynamoDB и вывод результатов в. js файле (который хранится в контейнере S3).

Я пытаюсь сделать его работоспособным много часов, но я застрял с классическими проблемами на node JS: порядок функций обратного вызова и область видимости переменных.

Вот код, который я использую

var AWS = require('aws-sdk');
AWS.config.update({region: 'eu-west-1'});
var s3 = new AWS.S3();

var tweetValue ;
var neutralValue ;

var destBucket = "twitterappfront1";
var ddb = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});

function sentimentVal(inputparams) {
    //    function resultrequest() 
    ddb.get(inputparams, function(err, data) {
    if (err) {
        console.log("Error", err);
    } else {
        console.log("Success", data.Item);

        //Catch tweets number in DynamoTB table and store un descriptor 
        var numtweets = (JSON.parse(JSON.stringify(AWS.DynamoDB.Converter.marshall(data.Item)))).tweets ;
        var tweetsObject = Object.getOwnPropertyDescriptor(numtweets, 'N') ;
        tweetValue = tweetsObject.value ;

        console.log ("test stringify = ", numtweets) ;
        console.log (tweetsObject.value) ;
        console.log ("Value = ", tweetValue) ;
        return tweetValue ;
    }
    });
}

exports.handler = (event) => {
    // Read options from the event.

    var paramsNeutral = {
        TableName: 'twitterSentiment',
        Key: { 'sentiment':'NEUTRAL' }
    };

    // Call sentimentVal function with paramsNeutral, and setNeutralValue callback function
    // 
    sentimentVal(paramsNeutral, setNeutralValue);

    function setNeutralValue (error, tweetValue) {
        if (error) console.error('ERROR !', error) ;
        else console.log ('callback tweetValue = ', tweetValue) ;
    }
};

Моя проблема в том, что кажется, что функция обратного вызова никогда не используется: у меня нет консольного вывода "ERROR" или "Callback tweetValue = "

И я не понимаю, как получить значение из функции sentvimentVal. Я попытался «вернуться», но не знаю, верный ли это путь.

Не могли бы вы мне помочь?

Спасибо

1 Ответ

2 голосов
/ 10 апреля 2020

Вы не ждете, пока обновление DynamoDB завершится до sh.

Обновите его, чтобы вернуть обещание, и используйте async / await

async function sentimentVal(inputparams) {
    try {
     //    function resultrequest() 
     const data = await ddb.get(inputparams).promise()

     console.log("Success", data.Item);

     //Catch tweets number in DynamoTB table and store un descriptor 
     var numtweets = (JSON.parse(JSON.stringify(AWS.DynamoDB.Converter.marshall(data.Item)))).tweets ;
     var tweetsObject = Object.getOwnPropertyDescriptor(numtweets, 'N') ;
     tweetValue = tweetsObject.value ;

     console.log ("test stringify = ", numtweets) ;
     console.log (tweetsObject.value) ;
     console.log ("Value = ", tweetValue) ;
     return tweetValue ;
   } catch (err) {
      console.log("Error", err);
      throw err
   }
}

И ожидайте его в обработчике

exports.handler = (event) => {
    // Read options from the event.

    var paramsNeutral = {
        TableName: 'twitterSentiment',
        Key: { 'sentiment':'NEUTRAL' }
    };

    // Call sentimentVal function with paramsNeutral, and setNeutralValue callback function
    // 
    const tweet = await sentimentVal(paramsNeutral, setNeutralValue);

    function setNeutralValue (error, tweetValue) {
        if (error) console.error('ERROR !', error) ;
        else console.log ('callback tweetValue = ', tweetValue) ;
    }
};

Я не уверен, что setNeutralValue должен делать.

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