【问题标题】:How can I maintain state in Alexa Lambda skills?如何在 Alexa Lambda 技能中保持状态?
【发布时间】:2018-01-16 22:43:31
【问题描述】:

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

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

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

所以,我想我打算将状态存储在数据库中或直接附加到会话(在 Alexa Node SDK 中,this.attributes)。所以我是否需要重写我的应用程序,以便我可以序列化状态,将其附加到会话,然后将状态拉出——我不能保留QuizMaster 实例来跟踪每件事——用户会话?

【问题讨论】:

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


    【解决方案1】:

    我需要重写我的应用程序,以便我可以序列化状态,将其附加到会话,然后将状态拉出——我无法保留 QuizMaster 实例来跟踪每个用户的情况-会话

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

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

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

    【讨论】:

    • 该死。这是我最大的担忧。谢谢。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您无需使用他们的 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;在我的技能中,它会在整个用户会话中持续存在。

      【讨论】:

        猜你喜欢
        • 2016-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-03
        相关资源
        最近更新 更多