我正在为Alexa开发一种智能家居技术。因此,来自Alexa的所有请求都被发送到我的AWS Lambda函数,该函数随后将请求转发到我们的服务器,服务器会联系到各个智能家居设备。因此,根据Alexa文档(https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-response.html#response),我可以同步地回答这些请求,这意味着我一直在等待设备上的操作完成(而lambda和我们的服务器之间的http连接仍然是开放的,导致->运行时间更长),并通过lambda将响应发送回Alexa。
另一种选择是异步地回答,将答案作为一个新的http请求发送到Alexa事件网关。
由于某些操作需要一些时间(考虑从服务器到智能家居设备的方式,执行操作、应答等)我更喜欢异步方法,因为它还节省了lambda的时间。我已经实现了所有必要的组件来回答异步,但我不知道该如何回答lambda,以防我回答异步。
我的Lambda目前看起来有点像这样:
const https = require('https');
exports.handler = function (request, context) {
function handleServerRequest(request, context) {
const doPostRequest = () => {
const data = request;
return new Promise((resolve, reject) => {
const options = {
host: 'xxx.ngrok.io',
path: '/dyn/alexa/request',
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
};
/* ... perform https request and resolve promise*/
});
};
doPostRequest().then((response) => {
log("DEBUG", "Server Response: ", JSON.stringify(response));
// in case the server decides to answer async (via event gateway) it
// immediately answers the https request with a flag "async: true".
if(response.async) {
// -> WHAT TO TELL THE LAMBDA HERE?
//context.succeed();
return;
}
context.succeed(response);
});
}
handleServerRequest(request, context, "");当我只做一个context.succeed()而没有适当的响应时,我会在Alexa应用程序中得到一个错误,告诉我“设备没有反应”,然后在Alexa通过事件网关接收到一个有效的StateReport指令之后,立即指示正确的状态。
如何正确结束lambda函数,以防我异步回答?
发布于 2020-06-20 12:53:18
我也有同样的问题。我刚刚验证了在处理程序中同步发送DeferredResponse和将作为异步更新发送到Alexa之后,它可以工作。
在不久的将来,我用PowerController和PowerLevelController,的请求进行了测试,我将测试其他的。
发布于 2020-07-02 07:14:22
我联系了亚历克莎的支持部门。我从谈话中得到的是
处理异步响应的文档化方法是在任何类型的同步响应之前发送异步响应。
根据经验,“任何类型的同步响应”包括返回空对象、空对象,甚至不将任何东西写入输出流(在Java 11 Lambda函数的上下文中)。
这在很大程度上削弱了异步响应的重要性,因为Lambda函数不能完全委托设备云并返回,而必须等待它响应。这,或者只是休眠直到超时,希望设备云在此之前异步响应。
发布于 2020-06-01 15:18:15
根据我的经验,您可以发送同步或异步响应(不能同时发送),这需要事先设置。
要设置异步响应,请参阅此文档,其中提到:
在“权限”页面上,幻灯片“发送Alexa事件”以指示您的技能将发送异步响应和/或更改报告事件。
https://stackoverflow.com/questions/62132808
复制相似问题