Агент Dialogflow не хранит данные в agent.conv (). Data

В исполнении диалогового потока обработчик выглядит так:

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  let conv = agent.conv();
  console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
  console.log('Dialogflow Request body: ' + JSON.stringify(request.body));

Я установил conv в agent.conv (). Пользователь приветствуется, и я хочу сохранить случайно сгенерированное число.

  function welcome(agent) {
    agent.add(`Welcome to Med Ed! Can I get your name?`);
    //generate random number -> num
    conv.data.random = num
    console.log(conv.data.random)
  } 

Вышеуказанное работает нормально, и номер выводится на консоль. Но когда вызывается другой обработчик функции, и я пытаюсь извлечь число:

 function intentHandler(agent) {
        // get the number from the agent.conv()
        getNum = conv.data.random 
        console.log(getNum)
 } 

Это print getNum - это NaN для консоли.

Я думал, что данные сохраняются, но я явно ошибался.

Спасибо


person Community    schedule 01.02.2020    source источник


Ответы (1)


Похоже, вы используете облачные функции либо в Google Cloud Platform, либо из встроенного редактора Dialogflow.

В обоих случаях код выполнения выполняется в облачных функциях, которые должны быть без состояния. Каждый запрос может быть выполнен в другой среде; поэтому, если необходимо хранить переменные, рекомендуется добавить дополнительный уровень устойчивости, например, базу данных.

Для вашего варианта использования вы можете рассмотреть три предложения:

1) Используйте глобальную переменную. Обычно функции выполняются в одной среде, поэтому вы можете хранить информацию в глобальной переменной; однако это не гарантируется, поэтому вам следует обработать случай, когда эта информация недоступна.

2) Используйте контексты Dialogflow в качестве временного хранилища. Вы можете сохранить случайное число в качестве параметра в контексте, и оно будет отправлено Dialogflow на веб-перехватчик, пока контекст активен.

3) Добавьте слой устойчивости к своим функциям. В GCP вы можете использовать Firestore или database, которая лучше соответствует вашему сценарию.

person Tlaquetzal    schedule 01.02.2020
comment
Спасибо, хранение @Tlaquetzal в контексте работает. Проблема с использованием firestore заключается в том, что требуется время, чтобы попасть в базу данных и вернуться. И в отношении глобальных переменных я столкнулся с проблемой, что, по моему мнению, глобальную переменную необходимо инициализировать перед ее использованием, например. let randNum = 0. И если это установлено из локальной функции, например randNum = 6, при следующем вызове выполнения randNum возвращается к своему начальному значению 0. Я прочитал этот пост medium.com/google-developer-experts/, который вот почему я подумал, что можно использовать данные agent.conv (). - person ; 02.02.2020
comment
@jcantona Вы пробовали подход agent.conv () на платформе Actions on Google? Предполагается, что там он будет временным хранилищем. Хотя я бы все равно выбрал контекст, если вы хотите использовать его для других интеграций. Теоретически для глобальных переменных значение не будет изменено на начальное значение, если функция не выполняется в другой среде; однако, поскольку значение может не сохраняться, я все равно буду использовать контексты - person Tlaquetzal; 02.02.2020
comment
Спасибо. Да, я пробовал использовать agent.conv () в действиях в Google, но все равно не сохранился. Но контексты так счастливы с этим. Спасибо - person ; 02.02.2020