【问题标题】:Alexa unable to fetch results from a siteAlexa 无法从网站获取结果
【发布时间】:2018-01-04 20:20:22
【问题描述】:

我对 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 版本:$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 报告请求 ID:621ee488-f187-11e7-b063-99e0641d97b4 持续时间: 2808.73 毫秒计费持续时间:2900 毫秒内存大小:128 MB 使用的最大内存:47 MB​​

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

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

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

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

【问题讨论】:

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


    【解决方案1】:
    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 调用并更好地理解这个问题是如何发生的。

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

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

    【讨论】:

    • 我明白你所说的,我把那部分代码放在另一个函数中,并从request函数中调用了那个函数。现在我收到了time out error任务在 3.00 秒后超时)。你能给我任何意见吗?
    • 你是如何调用第二个 lambda 的?并且至少第二个 lambda 工作正常吗?我想这可能与您如何调用 lambda 有关,默认情况下它被称为同步方法,但您可以将其指定为异步。在调用中 lambda.invoke(params, some_callback) params 应该有属性 InvocationType: "Event"
    • 我没有调用任何第二个 lambda,它只是完成所有工作的一个 lambda 函数。而我的ans 需要从request 收到的数据。
    • 好的,也许请求需要超过 3 秒,你可以尝试在你的 lambda 配置中增加它。 request 的回复中是否有任何日志?一旦我在连接到数据库但没有关闭它的 lambda(与 alexa 无关)中出现错误,所以我总是得到相同的 Task 在 3.00 秒后超时 .如果你更新你的代码,我可以看看
    • 在 aws 控制台中进入 Lambda 并选择您的 lambda 函数,在那里您会看到不同的部分,例如 DesignerFunction code 等,在 Basic settings 部分中有一个超时设置,其中一个字段为分钟,另一个字段为秒,更改您希望 lambda 函数在超时前运行多长时间的值。现在是 Alexa 准备答案的时候了;在您提到的链接中,他们希望增加 Alexa 等待用户响应的时间
    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 2014-02-23
    • 2015-03-21
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2018-03-26
    相关资源
    最近更新 更多