通过事件网关异步应答Alexa智能家居技能时如何回答AWS Lambda?

问题描述 投票:0回答:1

我正在为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
1个回答
0
投票

根据我的经验,您可以发送同步或异步响应(不能同时发送),这需要事先进行设置。

要设置异步响应,请参考此doc,其中提到:

在权限页面上,滑动发送Alexa事件以指示您的技能将发送异步响应和/或更改报告事件。

© www.soinside.com 2019 - 2024. All rights reserved.