Alexa 无法从站点获取结果
Alexa unable to fetch results from a site
我对 lambda 函数有两个疑问。
我正在尝试制作一个 Alexa 技能,它从 this 站点获取一些数据,并根据用户的请求进行一些操作。
- 现在我的 lambda 函数 在我的机器上正常工作(如果我注释掉一些行)并正确显示数据。但是,lambda 函数似乎没有等待
request
在 aws 服务器 上完成(因为我看不到 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"
)。
第二个很奇怪,我不知道为什么会这样。
- 我必须执行
npm install request
才能获得我的 request
函数 运行,并且必须上传我的 lambda 函数和 sdk 的 zip 文件。但正因为如此,我无法使用 Edit code Inline 选项编辑我的代码。如果我 select 该选项,它不会显示任何内容。虽然我可以看到我其他功能的编辑器。这不是一个真正的问题,但每次我对代码进行任何更改时都必须上传完整的代码,这很麻烦。
谁能帮我解决这些问题?谢谢。
一般来说,问题是你在请求完成之前让 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 并更好地理解这个问题是如何发生的文本。
- 我遇到了同样的问题,但一直找不到官方解释,虽然主要原因似乎是 zip 大小;在一些论坛上,人们谈论编辑 51,200 字节的最大限制,但我找不到官方的论据,相反,我上传了最大 1mb 的 zip 并且仍然能够编辑里面的文件,但我也有其他一些最大 6mb 的压缩包,我无法编辑任何内容。
您还可以寻找有助于将代码上传到 lambda 的工具,我使用的是 Serverless
我对 lambda 函数有两个疑问。
我正在尝试制作一个 Alexa 技能,它从 this 站点获取一些数据,并根据用户的请求进行一些操作。
- 现在我的 lambda 函数 在我的机器上正常工作(如果我注释掉一些行)并正确显示数据。但是,lambda 函数似乎没有等待
request
在 aws 服务器 上完成(因为我看不到 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"
)。
第二个很奇怪,我不知道为什么会这样。
- 我必须执行
npm install request
才能获得我的request
函数 运行,并且必须上传我的 lambda 函数和 sdk 的 zip 文件。但正因为如此,我无法使用 Edit code Inline 选项编辑我的代码。如果我 select 该选项,它不会显示任何内容。虽然我可以看到我其他功能的编辑器。这不是一个真正的问题,但每次我对代码进行任何更改时都必须上传完整的代码,这很麻烦。
谁能帮我解决这些问题?谢谢。
一般来说,问题是你在请求完成之前让 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 并更好地理解这个问题是如何发生的文本。
- 我遇到了同样的问题,但一直找不到官方解释,虽然主要原因似乎是 zip 大小;在一些论坛上,人们谈论编辑 51,200 字节的最大限制,但我找不到官方的论据,相反,我上传了最大 1mb 的 zip 并且仍然能够编辑里面的文件,但我也有其他一些最大 6mb 的压缩包,我无法编辑任何内容。
您还可以寻找有助于将代码上传到 lambda 的工具,我使用的是 Serverless