lambda 内的 s3.getObject 不返回任何内容

Posted

技术标签:

【中文标题】lambda 内的 s3.getObject 不返回任何内容【英文标题】:s3.getObject inside lambda doesn't return anything 【发布时间】:2017-01-18 16:18:06 【问题描述】:

我在 lambda 函数内有以下代码,这是 Amazon 回显技能:

"AMAZON.HelpIntent": function (intent, session, response) 
  var speechOutput ="Start";

  // Try S3
  var s3 = new AWS.S3(httpOptions:  timeout: 2000 );
  var params = 
    Bucket: 'bucket',
    Key: 'file',
  ;

  s3.getObject(params, function (err, data) 
    if (err) 
      // console.log(err, err.stack);
      speechOutput += "inside error";
      speechOutput += "Did not get it!" + err + ":===:" + err.stack;
    
    else 
      speechOutput += "inside success";
      // console.log(data);
      speechOutput += "Got it! :" + data.Body.toString('ascii');
    
  );

  speechOutput += " End. ";

  var repromptText = "Help reprompt.";
  response.ask(speechOutput, repromptText);
,

看起来很简单......但是,当技能被执行时,响应是这样的:

    
          "version": "1.0",
          "response": 
            "outputSpeech": 
              "type": "PlainText",
              "text": "Start End. "
            ,
            "shouldEndSession": false,
            "reprompt": 
              "outputSpeech": 
                "type": "PlainText",
                "text": "Help reprompt."
              
            
          ,
          "sessionAttributes": 
   

换句话说,s3.getObject 不会抛出任何错误,也不会运行。

lamda 函数具有“lambda_basic_execution”角色,在 IAM 中定义为对 S3 具有完全访问权限:


  "Version": "2012-10-17",
  "Statement": [
    
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    
  ]

在 S3 内部,有一个存储桶(名为“bucket”)和文件(名为“file”)。文件可从 CLI 和 Web 访问。存储桶和文件的权限设置为“所有人”。

请帮忙。

【问题讨论】:

【参考方案1】:

您无需等待 S3 调用完成。代码中的最后 3 行在调用 s3.getObject() 回调之前执行。尝试通过将最后 3 行移到回调中来更改代码,如下所示:

"AMAZON.HelpIntent": function (intent, session, response) 
  var speechOutput ="Start";

  // Try S3
  var s3 = new AWS.S3(httpOptions:  timeout: 2000 );
  var params = 
    Bucket: 'bucket',
    Key: 'file',
  ;

  s3.getObject(params, function (err, data) 
    if (err) 
      // console.log(err, err.stack);
      speechOutput += "inside error";
      speechOutput += "Did not get it!" + err + ":===:" + err.stack;
    
    else 
      speechOutput += "inside success";
      // console.log(data);
      speechOutput += "Got it! :" + data.Body.toString('ascii');
    


    speechOutput += " End. ";

    var repromptText = "Help reprompt.";
    response.ask(speechOutput, repromptText);
  );
,

【讨论】:

太棒了!这绝对改变了事情!现在出现超时错误,但进度不减!!!谢谢!

以上是关于lambda 内的 s3.getObject 不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章

从 s3 存储桶获取 2 个文件,并在使用 lambda 节点 js 将其上传到 s3 存储桶后制作 1 个 zip 文件

s3.getObject().createReadStream() :如何捕捉错误?

s3.getObject()。createReadStream():如何捕获错误?

如何在 Node.js 中使用带有 API 网关的 AWS Lambda 发送二进制响应? [复制]

获取s3对象元数据然后创建流

使用 mocha 和 chaiAsPromised 测试异步函数时的断言错误