首页 文章

Dialogflow的履行编辑器中的可变生命周期?

提问于
浏览
0

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

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

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

谢谢 .

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

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

    可以在Dialogflow请求中维护全局变量,但不保证 . 来自 Cloud 功能提示和技巧:

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

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

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

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

相关问题