Время жизни переменной в редакторе выполнения Dialogflow? - PullRequest
0 голосов
/ 10 декабря 2018

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

Позже я пытаюсь получить доступ к ежемесячной оплате объекта 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)

1 Ответ

0 голосов
/ 10 декабря 2018

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

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

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

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

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

...