Alexa技能包,无法使会话属性持续存在

时间:2017-01-20 03:39:03

标签: session alexa alexa-skills-kit

我一直致力于使用登录亚马逊帐户链接的技能,因此我可以获取用于我的技能的用户电子邮件地址和名称。我正在做类似于scoreKeeper示例的事情,使用eventHandlers.js和storage.js将项目保存到数据库。在eventHandlers.onLaunch中,我成功从亚马逊获取了个人资料名称和电子邮件地址,并将其保存到session.attributes,如下所示:

      var profile = JSON.parse(body);
                speechOutput="Hello, " + profile.name.split(" ")[0] + ".";
                var sessionAttributes = {};
                sessionAttributes = { name: profile.name, email: profile.email };
                session.attributes = sessionAttributes;
                console.log("Name in session:", session.attributes.name);

控制台日志显示了名称,因此我知道它正在session.attributes中保存,但是当我尝试访问storage.js或intentHandlers.js中的session.attributes时,它显示为空。我错过了什么?提前致谢。这让我很疯狂。

2 个答案:

答案 0 :(得分:0)

我通过在response.ask函数的回调中添加会话来实现这一点,如下所示:

   ask: function (speechOutput, repromptSpeech, _session) {
        this._context.succeed(buildSpeechletResponse({
            session: _session,
            output: speechOutput,
            reprompt: repromptSpeech,
            shouldEndSession: false
        }));
    },

它有会话:this._session用于保存会话,但这对我来说似乎没有用。将其作为变量传递。

答案 1 :(得分:0)

我们假设您想要从用户那里获取城市名称,并且稍后可以在Alexa会话中访问该值:

1)在JSON响应中预定义键/值对:

def build_response(session_attributes, speechlet_response):
return {
    'version': '1.0',
    'sessionAttributes': {
        "session_attributes": {
            'NameOfCity': city_name,
        }
},
    'response': speechlet_response
}

2)在全局范围内,将变量声明为空字符串:

city_name = "",

3)每当您在函数中更新该变量时,请确保将该变量引用为全局变量。例如:

def set_city_name_in_session(intent, session):

card_title = intent['name']
session_attributes = {}
should_end_session = False

if 'CityIntent' in intent['slots']:
    global city_name
    city_name = intent['slots']['CityIntent']['value']

4)在创建需要访问此变量的函数时,将全局变量作为参数传递给函数,然后在函数内公开所有会话密钥/对值,如下所示:

def access_variables(intent, session, city_name):

card_title = intent['name']
session_attributes = {}
should_end_session = False
exposed_attributes = session['attributes']['session_attributes']
city_name_attribute_value = exposed_attributes.get('NameOfCity')

if (some_kind_of_condition):
    do something awesome with city_name_attribute_value

要进行测试,请将示例话语输入Service Simulator,然后检查值是否在Lambda JSON响应中持久存在。