1

我正在帮助创建一个聊天机器人,它从谷歌表格中提取房地产数据,并将该信息显示给用户。用户输入一个地址,然后将提取的信息分配给一个 houseData 变量,该变量已通过 http 请求在函数外部声明。houseData 对象具有卧室、浴室、monthlyPayment、地址等键,然后在 agent.add Payload 中引用,用于在聊天小部件中向用户显示键的值。这都映射到一个意图。

稍后,我尝试在映射到不同意图的函数中访问 houseData 对象的monthlyPayment,以查看用户报告的收入与房屋付款的比较情况。houseData 变量是未定义的,即使在 firebase 中我可以看到在第一个意图期间从 console.log 中的谷歌表接收到信息。

完成特定功能映射到的意图后,是否会在履行编辑器中重置变量值?如何在编辑器中存储可在整个对话流程中访问的持久信息?这是我应该设置新上下文的情况吗?

谢谢你。

编辑:我添加了代码的快速模型以帮助可视化问题:

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)
4

1 回答 1

2

全局变量可能会在您的 Dialogflow 请求中维护,但不能保证。来自 Cloud Functions 提示和技巧:

不能保证云函数的状态将被保留以供将来调用。但是,Cloud Functions 通常会回收先前调用的执行环境。如果您在全局范围内声明变量,则其值可以在后续调用中重用,而无需重新计算。

参考:https ://cloud.google.com/functions/docs/bestpractices/tips#use_global_variables_to_reuse_objects_in_future_invocations

通常(出于性能原因缓存数据)您会将所有数据存储在 Firestore/RTDB 中,如果houseData未定义,则将其从数据库中拉出,否则您可以houseData直接用于缓存副本。在这种情况下,尽管您可能希望记录它的年龄并相应地刷新它。

但是,如果houseData每个用户/会话都不同,那么您可能会被迫在每次请求时从数据库中提取它。(请注意,如果您在 Firebase 上运行函数和数据库,无论如何它都会很快。)

于 2018-12-10T02:41:37.710 回答