Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session Alexa技能工具包,难以保持会话属性_Session_Alexa_Alexa Skills Kit - Fatal编程技术网

Session Alexa技能工具包,难以保持会话属性

Session Alexa技能工具包,难以保持会话属性,session,alexa,alexa-skills-kit,Session,Alexa,Alexa Skills Kit,我一直在研究一项技能,我使用登录亚马逊帐户链接,这样我就可以抓取用户的电子邮件地址和名称,以便在我的技能中使用。我正在做一些类似于记分员示例的事情,使用eventHandlers.js和storage.js将项目保存到数据库中。在eventHandlers.onLaunch中,我成功地从Amazon获取了配置文件名和电子邮件地址,并将其保存到会话中。属性如下: var profile = JSON.parse(body); speechOutput="

我一直在研究一项技能,我使用登录亚马逊帐户链接,这样我就可以抓取用户的电子邮件地址和名称,以便在我的技能中使用。我正在做一些类似于记分员示例的事情,使用eventHandlers.js和storage.js将项目保存到数据库中。在eventHandlers.onLaunch中,我成功地从Amazon获取了配置文件名和电子邮件地址,并将其保存到会话中。属性如下:

      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);
   ask: function (speechOutput, repromptSpeech, _session) {
        this._context.succeed(buildSpeechletResponse({
            session: _session,
            output: speechOutput,
            reprompt: repromptSpeech,
            shouldEndSession: false
        }));
    },

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

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

      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);
   ask: function (speechOutput, repromptSpeech, _session) {
        this._context.succeed(buildSpeechletResponse({
            session: _session,
            output: speechOutput,
            reprompt: repromptSpeech,
            shouldEndSession: false
        }));
    },

它有session:this.\u session用于保存会话,但这似乎对我不起作用。将其作为变量进行传递。

假设您希望从用户处获取城市名称,并能够在稍后的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

要进行测试,请在服务模拟器中输入示例语句,然后检查值是否在Lambda JSON响应中持续存在。

请注意,如果您不想在全局范围内声明变量,您使用的容器在后续Lambda调用中可能无法获得相同的容器。。。