我正在帮助创建一个聊天机器人,该机器人从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)
答案 0 :(得分:0)
全局变量可能在Dialogflow请求中维护,但不能保证。来自云功能的提示和技巧:
不能保证将Cloud Function的状态保留下来以备将来调用。但是,云功能通常会回收先前调用的执行环境。如果在全局范围内声明变量,则可以在后续调用中重用其值,而不必重新计算。
通常(出于性能原因缓存数据),您会将所有数据存储在Firestore / RTDB中,如果houseData
未定义,则将其拉出数据库,否则您可以直接将houseData
用于缓存的副本。在这种情况下,尽管您可能想要记录它的年龄并相应地对其进行刷新。
但是,如果每个用户/会话的houseData
都不相同,那么您可能会在每次请求时被迫从数据库中将其提取。 (请注意,如果您在Firebase上运行功能和数据库,无论如何都会很快。)