Время жизни переменной в редакторе выполнения Dialogflow?

Я помогаю создать чат-бота, который извлекает данные о недвижимости из таблицы Google и отображает эту информацию пользователю. Пользователь вводит адрес, затем извлеченная информация присваивается переменной houseData, которая была объявлена ​​вне функции с HTTP-запросом. У объекта houseData есть такие ключи, как спальни, ванные комнаты, ежемесячная оплата, адрес и т. Д., На которые затем ссылаются в полезной нагрузке agent.add для отображения значений ключей для пользователя в виджете чата. Все это связано с одним намерением.

Позже я пытаюсь получить доступ к monthPayment объекта houseData в функции, сопоставленной с другим намерением, чтобы увидеть, как зарегистрированный доход пользователя сравнивается с оплатой за дом. Переменная houseData не определена, хотя в firebase я вижу, что информация получена из таблицы Google в console.log во время первого намерения.

Сбрасываются ли значения переменных в редакторе выполнения после завершения намерения, которому сопоставлены определенные функции? Как я могу сохранить в редакторе постоянную информацию, к которой можно будет получить доступ во время разговора? Это ситуация, когда я должен установить новый контекст?

Спасибо.

edit: я добавил быстрый макет кода, чтобы помочь визуализировать проблему:

let houseData;

function sendHouseData(agent) {
  let address = userInput
  return getHouseData(address).then(agent.add(new Payload(
    `Your house has ${houseData.bedrooms} bedrooms and ${houseData.bathrooms} bathrooms.`
  ))).catch(err);
}

function getHouseData(address) {
  https.get(apiURL, (res) => {
    res.on('end', () => {
      houseData = parsedJSONData
    })
  })
}

// ------- LATER ------ //

let userData = {
  income: '',
  qualified: true
}

function qualify(agent) {
  // user self reports their monthly income thru some quick reply options
  if (houseData.monthlyPayment / userData.income < 0.39) { // houseData is undefined at this point
    userData.qualified = false
  }
}

intentMap.set(enterAddress, sendHouseData);
intentMap.set(qualify, qualify)

person mdb    schedule 09.12.2018    source источник


Ответы (1)


Глобальные переменные могут поддерживаться в ваших запросах Dialogflow, но это не гарантируется. Из советов и рекомендаций по работе с облачными функциями:

Нет никакой гарантии, что состояние облачной функции будет сохранено для будущих вызовов. Однако облачные функции часто повторяют среду выполнения предыдущего вызова. Если вы объявляете переменную в глобальной области видимости, ее значение можно повторно использовать в последующих вызовах без повторного вычисления.

Ссылка: https://cloud.google.com/functions/docs/bestpractices/tips#use_global_variables_to_reuse_objects_in_future_invocations

Обычно (для кэширования данных из соображений производительности) вы должны хранить все свои данные в Firestore / RTDB, и если houseData не определено, вытащите их из базы данных, иначе вы можете использовать houseData непосредственно для кэшированной копии. В этом случае вы, вероятно, захотите записать, сколько ему лет, и обновить его соответствующим образом.

Однако, если houseData будет отличаться для каждого пользователя / сеанса, вы можете быть вынуждены извлекать его из базы данных при каждом запросе. (Обратите внимание, что если вы запускаете функции и базу данных на Firebase, это все равно будет быстро.)

person Antony Harfield    schedule 10.12.2018