2017-01-20 5 views
0

Я работаю над навыками, в которых я пользуюсь Login With Amazon link, поэтому я могу получить адрес электронной почты и имя пользователя, чтобы использовать его в своем умении. Я делаю что-то похожее на образец scoreKeeper, используя eventHandlers.js и storage.js для сохранения элементов в базе данных. В eventHandlers.onLaunch я успешно получаю имя профиля и адрес электронной почты от Amazon, и я сохранить его в session.attributes так:Набор навыков Alexa, проблема с получением атрибутов сеанса для сохранения

 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, но когда я пытаюсь получить доступ к session.attributes в моем файле storage.js или intentHandlers.js, он показывает, что он пуст. Что мне не хватает? Заранее спасибо. Это сводило меня с ума.

ответ

0

я получил эту работу, добавив сеанс обратного вызова функции response.ask, как это:

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

Он сессия: this._session для сохранения сессии, но это не кажется, работать на меня. Передача его как переменной.

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) Всякий раз, когда вы обновлять эту переменную внутри функции, убедитесь, что вы ссылаетесь на этот variab как глобальный. Например:

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.