【问题标题】:Using a JSON file from S3 in AWS Lambda function (for Alexa)在 AWS Lambda 函数中使用来自 S3 的 JSON 文件(对于 Alexa)
【发布时间】:2018-06-10 07:32:09
【问题描述】:

上下文:我正在使用 AWS Lambda 函数创建一个 Alexa 技能,并将一个大型 JSON 文件放在 S3 中,而不是尝试将它放在 Lambda 函数代码本身中。我一直在尝试访问 S3 文件的内容并将其分配给函数中的变量,以便我可以在其余代码中使用它,但它似乎无法正常工作。请参阅下面的相关代码,以及我打印到控制台时可以看到的内容。

Lambda 函数:

var handlers = {

  'LaunchRequest': function() {

    var AWS = require('aws-sdk');
    var s3 = new AWS.S3();
    data = s3.getObject(myParams, function(err, data) {
        if(err) { console.log(err, err.stack);}
        else {
            console.log('First step');
            var fileText = data.Body.toString();
            console.log('Second Step' + fileText);
            return fileText;
        }
    });

    console.log('Third Step' + data);
  }
}

控制台输出:

Function Logs:
START Version: $LATEST
2017-12-29T23:59:38.585Z        Warning: Application ID is not set
2017-12-29T23:59:40.024Z        Third Step[object Object]
2017-12-29T23:59:40.159Z        First step
2017-12-29T23:59:40.183Z        Second Step[{category1: "test1", category2: "test2", category3: "test3"}]

为什么这段代码首先打印“第三步”?

【问题讨论】:

    标签: json amazon-web-services amazon-s3 aws-lambda alexa


    【解决方案1】:

    记住节点中的一切都是异步的。 getObject 将在其回调被触发之前返回。它的返回值无关紧要;响应只能由回调访问。

    将此步骤移至回调,您将按照预期的顺序获得行。

    如果您觉得这不直观,您可能更喜欢 Python 等更直接的语言来编写 lambda。如果您致力于 js,您可能会发现 async 库,尤其是 waterfall 方法,很有帮助。

    【讨论】:

    • 它应该还打印了一些东西。
    • 应该打印什么?回调的返回无处可去,getObject 返回一个 AWS.Request,它是 [Object object]。但实际上并没有对内容做任何事情。显示所有控制台日志调用。
    猜你喜欢
    • 1970-01-01
    • 2023-01-18
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2018-10-18
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多