【发布时间】:2020-09-19 18:55:29
【问题描述】:
我正在为 Alexa 开发一项智能家居技能。因此,来自 Alexa 的所有请求都发送到我的 AWS Lambda 函数,然后将请求转发到我们的服务器,该服务器与各个智能家居设备联系。 因此,根据 Alexa 文档 (https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-response.html#response),我可以同步回答这些请求,这意味着我一直等到设备上的操作完成(而 lambda 和我们的服务器之间的 http 连接保持打开状态 -> 导致收费为lambda 运行时间更长)并通过 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 函数?
【问题讨论】:
标签: node.js amazon-web-services aws-lambda alexa alexa-skill