我一直致力于使用登录亚马逊帐户链接的技能,因此我可以获取用于我的技能的用户电子邮件地址和名称。我正在做类似于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时,它显示为空。我错过了什么?提前致谢。这让我很疯狂。
答案 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响应中持久存在。