在Dialogflow的实现编辑器中是否存在可变生存期?

时间:2018-12-09 22:25:55

标签: node.js dialogflow dialogflow-fulfillment

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

稍后,我尝试访问映射到不同意图的函数中的houseData对象的monthlyPayment,以查看用户的报告收入与房屋付款相比。即使在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 :(得分:0)

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

  

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

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

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

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