我正在帮助创建一个聊天机器人从谷歌工作表中提取房地产数据,并将该信息显示给用户 . 用户输入一个地址,然后将拉出的信息分配给一个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 回答
可以在Dialogflow请求中维护全局变量,但不保证 . 来自 Cloud 功能提示和技巧:
参考:https://cloud.google.com/functions/docs/bestpractices/tips#use_global_variables_to_reuse_objects_in_future_invocations
通常(出于性能原因缓存数据),您将所有数据存储在Firestore / RTDB中,如果
houseData
未定义,则将其从数据库中拉出,否则您可以直接使用houseData
作为缓存副本 . 在这种情况下,您可能希望记录它的年龄并相应地刷新它 .但是,如果每个用户/会话的
houseData
会有所不同,那么您可能会被迫在每次请求时从数据库中提取它 . (请注意,如果您在Firebase上运行函数和数据库,它将会很快 . )