Session Alexa技能工具包,难以保持会话属性
我一直在研究一项技能,我使用登录亚马逊帐户链接,这样我就可以抓取用户的电子邮件地址和名称,以便在我的技能中使用。我正在做一些类似于记分员示例的事情,使用eventHandlers.js和storage.js将项目保存到数据库中。在eventHandlers.onLaunch中,我成功地从Amazon获取了配置文件名和电子邮件地址,并将其保存到会话中。属性如下: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="
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调用中可能无法获得相同的容器。。。