【问题标题】:Node.js on AWS Lambda and DynamoDBAWS Lambda 和 DynamoDB 上的 Node.js
【发布时间】:2020-05-21 00:44:58
【问题描述】:

我正在尝试创建一个 Lambda 函数来生成一个 .js 脚本(以便与 Chart.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 函数中获取值。我尝试了“返回”,但不知道是不是正确的方式。

你能帮帮我吗?

谢谢

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    您无需等待 DynamoDB 更新完成。

    更新它以返回一个承诺并使用 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 应该做什么。

    【讨论】:

    • 您好,感谢您的帮助!我尝试使用您的更正,但在“ const tweet = await SentimentVal(paramsNeutral, setNeutralValue);”上有一个错误行它显示错误“解析错误:意外的令牌情绪值”。您对可能导致此问题的原因有任何想法吗?谢谢!
    • 我成功在 export.handler = async (event) => { 中添加异步
    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 2018-11-22
    • 1970-01-01
    • 2021-01-02
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多