Aws lambda 我如何在Alexa Lambda skills中保持状态?

Aws lambda 我如何在Alexa Lambda skills中保持状态?,aws-lambda,alexa,alexa-skills-kit,Aws Lambda,Alexa,Alexa Skills Kit,我想写一个问答游戏,Alexa从列表中随机问10个问题,记录分数,然后公布。我使用Node.js Lambda函数来实现这一点 我写了一个类,QuizMaster,它运行测验:它询问用户他们喜欢的类别和难度级别,创建带有随机a/B/C答案槽的随机问题列表,并检查提供的答案对于最后一个口语问题是否正确 这里是让我感到棘手的地方:在哪里可以保存对QuizMaster实例的引用?如果我将其创建为intent处理程序之外的变量,它第一次运行良好,但是如果用户重新调用该技能,quizmaster仍然存在,

我想写一个问答游戏,Alexa从列表中随机问10个问题,记录分数,然后公布。我使用Node.js Lambda函数来实现这一点

我写了一个类,
QuizMaster
,它运行测验:它询问用户他们喜欢的类别和难度级别,创建带有随机a/B/C答案槽的随机问题列表,并检查提供的答案对于最后一个口语问题是否正确

这里是让我感到棘手的地方:在哪里可以保存对
QuizMaster
实例的引用?如果我将其创建为intent处理程序之外的变量,它第一次运行良好,但是如果用户重新调用该技能,quizmaster仍然存在,并将立即重新宣布他们的最终分数并结束游戏。这让我有点困惑,因为我的思维模式是,每次命中Lambda端点时,就像Amazon正在运行
node index.js
,当会话结束时,执行就结束了。但我想我错了——它是否更像Amazon只运行一次
node index.js
,在一个循环中保持打开状态,监听事件,然后每个事件都进入处理函数?所以,如果我连续运行两次,我仍然有那些旧变量和它们的旧值?这是否意味着如果10个用户同时运行我的Alexa skill,他们共享相同的变量值/修改彼此的状态?或者它会像AWS运行文件10次,并向我收取10倍于一次执行内存的费用

因此,我想我应该将状态存储在数据库中或直接连接到会话(在Alexa Node SDK中,
this.attributes
)。那么,我是否需要重写我的应用程序,这样我就可以序列化状态,将其附加到会话,然后将状态拉出——我不能保留一个
QuizMaster
实例来跟踪每个用户会话的情况

我需要以这样一种方式重写我的应用程序:我可以序列化状态,将其附加到会话,然后将状态拉出——我不能保留QuizMaster实例来跟踪每个用户会话的情况

是的,这正是你需要做的

每个调用都是独立的,后续调用可能由同一容器处理,也可能不由同一容器处理


在调用过程中保持状态的唯一可靠方法是使用外部存储,如DynamoDB、RDS等。

Amazon和许多其他人发布了使用DynamoDB保存状态的说明和示例。尝试在“Alexa dynamoDB”上进行搜索。

您不需要使用他们的节点或Java SDK,也不必使用AWD Lambda来承载技能响应。我在运行Apache/PHP的普通web服务器上自行主持我的技能交互

Alexa只要求您返回一个JSON响应

我只使用PHP编写了自己的处理程序。这很简单。我甚至能够在带回用户请求的数据时出现短暂延迟的情况下实现渐进式响应。Alexa说,“等一下,我查一下。”这样用户就不会认为会话已经延迟或结束了。在运行查找之前,我使用PHP中的stream_context_create和file_get_内容发布到指令API端点。我还使用PHP会话变量维护会话和状态。当用户退出时,会话结束。如果我想存储特定用户的当前状态,我只需要使用PHP将当前状态写入MySQL数据库

有人编写了一个PHP处理程序来完成这一切。我不使用这个,但对于更熟悉PHP vs Node或Java的人来说,这是一个很好的开始

我的有点不同。为了维护会话,我使用以下代码:

 $json = file_get_contents('php://input');
 $data = json_decode($json);

 $sessionid = str_replace("amzn1.echo-api.session.","",$data->session->sessionId);

 session_id($sessionid);
 session_start();

这允许我存储会话变量,比如$_session['count']=10;在我的技能中,它会贯穿整个用户会话

该死。这是我最担心的。谢谢