如何在Alexa Lambda技能中保持状态?

时间:2018-01-16 22:43:31

标签: aws-lambda alexa alexa-skills-kit

我正在尝试编写一个问答游戏,其中Alexa从列表中提出10个随机问题,并跟踪得分,然后宣布它。我正在使用Node.js Lambda函数来执行此操作。

我写了一个类QuizMaster,它运行测验:它询问用户他们的首选类别和难度级别,用随机A / B / C答案位创建随机问题列表,并检查是否提供的答案对于最后提到的问题是正确的。

对我来说,事情变得棘手:我可以在哪里保存对QuizMaster实例的引用?如果我将它创建为意图处理程序之外的变量,它第一次就可以正常工作,但如果用户重新调用该技能,那么测验主管仍然存在,并会立即重新宣布他们的最终得分并结束游戏。这让我感到困惑,因为我的心智模型是,每次敲击Lambda端点时,就像亚马逊正在运行node index.js,当会话结束时,执行结束。但我想我错了 - 它更像是亚马逊运行node index.js 一次,在循环中保持打开以监听事件,并且每个事件都转到处理程序函数?所以,如果我连续两次运行它,我仍然会用旧值来获取那些旧变量?这是否意味着如果10个用户同时运行我的Alexa技能,他们都会为这些变量共享相同的值/修改彼此的状态?或者它会像AWS运行文件10次并向我收取10倍的单次执行内存?

所以,我想我的意思是将状态存储在数据库中或直接连接到会话(在Alexa Node SDK中,this.attributes)。所以我需要以这样的方式重写我的应用程序:我可以序列化状态,将其附加到会话,然后将状态拉出来 - 我无法保留QuizMaster实例来跟踪事物每个用户会话?

3 个答案:

答案 0 :(得分:1)

  

我需要以这样的方式重写我的应用程序:我可以序列化状态,将其附加到会话,然后将状态拉出来 - 我无法保留QuizMaster实例来跟踪每个事物的状态-user会话

是的,这正是你需要做的。

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

在调用之间保持状态的唯一可靠方法是使用外部存储,例如DynamoDB,RDS等。

答案 1 :(得分:0)

亚马逊和很多其他人已经发布了使用dynamoDB保存状态的说明和示例。尝试搜索“Alexa dynamoDB”。

答案 2 :(得分:0)

您不需要使用他们的Node或Java SDK,也不必使用AWD Lambda来托管您的技能响应。我在运行Apache / PHP的普通Web服务器上自行托管技能的交互。

Alexa仅要求您发送回JSON响应。

我仅使用PHP编写了自己的处理程序。这很简单。当恢复用户请求的数据有短暂延迟时,我什至能够实施渐进式响应。 Alexa说:“等一下,等一下。”因此用户不会认为会话已滞后或结束。在运行查找之前,我在PHP中使用stream_context_create和file_get_contents发布到指令API端点。我还使用PHP会话变量维护会话和状态。用户退出时,会话结束。如果我想存储特定用户的当前状态,只需使用PHP将当前状态写入MySQL数据库即可。

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

https://github.com/Fever905/amazon-alexa-php

我的与众不同。为了维持会话,我使用以下代码:

 $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之类的会话变量。在“我的技能”中持续存在于整个用户会话中。