lambda中的s3.getObject在第一次运行时没有返回任何内容但在此之后返回

时间:2017-09-28 12:49:21

标签: javascript node.js amazon-s3 sdk

我在lambda函数中有以下代码

 var objectData = [];

"GetResearchBlogIntent" : function(){

var bucketParams = {
  Bucket: "etfs-alexa-app",
  Key: "researchBlogs/IndonesiaSecuresMajorityStakeInGrasbergMine.txt"
}

s3.getObject(bucketParams, function(err, data){

     if (err){
       console.info( "Error", err);

     }

     else{
   objectData.push(data.Body.toString("utf-8"));


     }

 })
this.emit(":ask", objectData )}

这将在您第一次运行时返回任何内容,但无论您运行多少次都将从on s3中的文本文件返回正确的信息,除非您完全重置它。

我不明白如何让lambda等待s3.getObject获取信息。

我试过了:

 "GetResearchBlogIntent" : function(){
    var bucketParams = {
      Bucket: "etfs-alexa-app",
      Key: "researchBlogs/IndonesiaSecuresMajorityStakeInGrasbergMine.txt"
    }

    s3.getObject(bucketParams, function(err, data){

      if (err){
        console.info( "Error", err);

      }

      else{
        objectData.push(data.Body.toString("utf-8"));
        console.info("4")
        context.succeed()
      }

    })
    this.emit(":ask", objectData )
  }

但我不认为我这样做是正确的,因为它只是给了我没有定义的错误上下文,它在这里:

exports.handler = (event, context, callback) => {
var alexa = Alexa.handler(event, context, callback);
    alexa.registerHandlers(handlers);
    alexa.execute();
  };

我也尝试使用回调,但在使用SDK库时我不确定正确的语法。

1 个答案:

答案 0 :(得分:0)

您遇到异步问题。当emit甚至没有开始时,您正在致电getObject,这就是为什么您有空object的原因。

调用getObject内的发射。

      s3.getObject(bucketParams, (err, data) => {
          if (err) {
            // ...
          } else {
            objectData.push(data.Body.toString("utf-8"));

            context.succeed();

            this.emit(":ask", objectData);
          }
        });

getObject包裹在function内,然后在结尾处调用emit