Alexa无法从网站获取结果

时间:2018-01-04 20:20:23

标签: aws-lambda alexa alexa-skills-kit

我对 lambda函数有两个疑问。

我尝试制作 Alexa技能,从this网站获取一些数据,然后根据用户的请求进行一些操作。

  1. 现在我的 lambda函数在我的机器上正常工作(如果我注释掉一些行)并正确显示数据。但是,lambda函数似乎不等待request aws服务器上完成,(因为我看不到 log < / strong>在我的函数内打印在服务器上的日志中)。
  2. 这是我用来从网站获取数据的代码:

    console.log("Initiating request");
    request({
        url: url,
        json: true
    }, function(error, response, body){
        console.log("Request send, waiting to load the data..."); // Not executed
        if(!error && response.statusCode == 200){
            console.log("Data obtained :: ");
            data = body;
            console.log(data.toString());
            });
        }
        else{
            console.log("Error: " + error.message); 
        }
    });
    

    Here是任何进一步参考的完整代码。

    这是执行的日志输出:

      

    START RequestId:621ee488-f187-11e7-b063-99e0641d97b4版本:$ LATEST   2018-01-04T19:42:23.742Z 621ee488-f187-11e7-b063-99e0641d97b4 GetNewContestIntent   2018-01-04T19:42:23.778Z 621ee488-f187-11e7-b063-99e0641d97b4数据   由用户给出:undefined undefined undefined undefined undefined   2018-01-04T19:42:23.798Z 621ee488-f187-11e7-b063-99e0641d97b4您好   2018-01-04T19:42:26.419Z 621ee488-f187-11e7-b063-99e0641d97b4启动   请求   2018-01-04T19:42:26.481Z 621ee488-f187-11e7-b063-99e0641d97b4这里有   一些比赛:END RequestId:621ee488-f187-11e7-b063-99e0641d97b4   报告RequestId:621ee488-f187-11e7-b063-99e0641d97b4持续时间:   2808.73 ms结算时长:2900 ms内存大小:128 MB最大使用内存:47 MB​​

    (未定义的值是可以接受的,我希望它们是"undefined")。

    第二个很奇怪,我不知道为什么它发生在我身上。

    1. 为了让我的npm install request函数运行,我必须执行request,并且必须上传我的lambda函数和sdk的zip文件。但正因为如此,我无法使用编辑代码内嵌选项编辑我的代码。如果我选择该选项,它不会显示任何内容。虽然我可以看到编辑器的其他功能。这不是一个真正的问题,但每次我在代码中进行任何更改时都必须上传完整的代码,这很麻烦。
    2. 任何人都可以帮我解决这些问题吗?谢谢。

1 个答案:

答案 0 :(得分:1)

  1. 一般来说,问题是你在请求完成之前正在回复this.emit(':responseReady');,这是因为在你的代码的这一部分你调用执行请求的request,但是你在那里定义处理响应的function将被执行async,所以在此之前程序将继续请求if(invalidRequest)之后的下一个命令,依此类推,直到几行之后达到alexa的响应。

    console.log("Initiating request");
    request({
        url: url,
        json: true
    }, function(error, response, body){
        console.log("Request send, waiting to load the data...");
        ...
    });
    
    if(invalidRequest){
        speechOutput = errorMessage;
    }else{
        speechOutput = GET_CONTEST_MESSAGE + ans;
    }
    
    console.log(speechOutput);
    this.response.cardRenderer(SKILL_NAME, speechOutput);
    this.response.speak(speechOutput);
    this.emit(':responseReady');
    
  2. 这可以通过两种方式解决。如果您的alexa的答案需要来自请求的数据,那么您应该为您的请求发出回调函数的响应。 Here是此实施的一些示例。

    另一种选择是,如果您回答不一定需要数据,也许您要求alexa处理数据,她只会说数据正在处理中。对于这种情况,我会在不同的lambda函数中处理请求和数据,而intent将调用另一个将自行运行的lambda。 Here是一个文本,可以帮助您从另一个lambda调用一个lambda,并更好地了解这个问题是如何发生的。

    1. 我遇到了同样的问题,但未能找到官方的探索,但主要原因似乎是拉链尺寸;在一些论坛上人们谈论编辑51,200字节的最大限制,但我无法找到官方论据,而是我已经上传了拉链达到1mb仍然能够编辑里面的文件,但我也有其他一些拉链高达6mb,在那里我无法编辑任何东西。
    2. 您还可以查找工具以方便将代码上传到lambda,我正在使用的是Serverless