Alexa 无法从站点获取结果

Alexa unable to fetch results from a site

我对 lambda 函数有两个疑问

我正在尝试制作一个 Alexa 技能,它从 this 站点获取一些数据,并根据用户的请求进行一些操作。

  1. 现在我的 lambda 函数 在我的机器上正常工作(如果我注释掉一些行)并正确显示数据。但是,lambda 函数似乎没有等待 requestaws 服务器 上完成(因为我看不到 log 在我的函数中打印在服务器的日志中)。

这是我用来从站点获取数据的代码:

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 Version: $LATEST 2018-01-04T19:42:23.742Z 621ee488-f187-11e7-b063-99e0641d97b4 GetNewContestIntent 2018-01-04T19:42:23.778Z 621ee488-f187-11e7-b063-99e0641d97b4 Data given by the user : undefined undefined undefined undefined undefined 2018-01-04T19:42:23.798Z 621ee488-f187-11e7-b063-99e0641d97b4 Hello 2018-01-04T19:42:26.419Z 621ee488-f187-11e7-b063-99e0641d97b4 Initiating request 2018-01-04T19:42:26.481Z 621ee488-f187-11e7-b063-99e0641d97b4 Here are some contests: END RequestId: 621ee488-f187-11e7-b063-99e0641d97b4 REPORT RequestId: 621ee488-f187-11e7-b063-99e0641d97b4 Duration: 2808.73 ms Billed Duration: 2900 ms Memory Size: 128 MB Max Memory Used: 47 MB

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

第二个很奇怪,我不知道为什么会这样。

  1. 我必须执行 npm install request 才能获得我的 request 函数 运行,并且必须上传我的 lambda 函数和 sdk 的 zip 文件。但正因为如此,我无法使用 Edit code Inline 选项编辑我的代码。如果我 select 该选项,它不会显示任何内容。虽然我可以看到我其他功能的编辑器。这不是一个真正的问题,但每次我对代码进行任何更改时都必须上传完整的代码,这很麻烦。

谁能帮我解决这些问题?谢谢。

  1. 一般来说,问题是你在请求完成之前让 alexa 响应 this.emit(':responseReady');,这是因为在你的代码的这一部分你调用了 request 来执行请求,但是您在那里定义的用于处理响应的 function 将异步执行,因此在此之前程序将继续请求 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');
    

这可以通过两种方式解决。如果您的 alexa 的回答 需要 来自请求的数据,那么您应该为您的请求发出响应回调函数。 Here 是此实现的一些示例。

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

  1. 我遇到了同样的问题,但一直找不到官方解释,虽然主要原因似乎是 zip 大小;在一些论坛上,人们谈论编辑 51,200 字节的最大限制,但我找不到官方的论据,相反,我上传了最大 1mb 的 zip 并且仍然能够编辑里面的文件,但我也有其他一些最大 6mb 的压缩包,我无法编辑任何内容。

您还可以寻找有助于将代码上传到 lambda 的工具,我使用的是 Serverless