我在Firebase中有一个Realtime DB,并在Google Cloud的Dialogflow中设置了代理 . 此代理程序代理正在获取有关总线路由名称的数据 . 要求最终用户提供 Bus 车号码,代理商应根据该路线号码获取相关信息 . 我可以调用数据库,但仅限于设置总线编号 .
因此,例如下面我可以基于将 snapshot.child
设置为 100
来拉入 100
的总线信息 . 但我希望 snapshot.child
根据Dialogflow中的 askBus
参数进行更改 . 有什么建议?
function handleBus(agent) {
const bus = agent.parameters.bus;
agent.add(`Thank you...`);
return admin.database().ref('Routes').once("value").then((snapshot) => {
var routeInfo = snapshot.child('100/route_desc').val();
var routeName = snapshot.child('100/route_long_name').val();
agent.add(`Bus info is ` + routeInfo + ' and is called ' + routeName);
2 回答
通常,处理此问题的最佳方法是在设置查询路径时引用总线编号的节点 . 获得结果肯定是可能的,但这意味着您需要为每个查询提供比您需要的更多的数据 .
但有几种方法可以做到这一点 .
与您现在如何做的最相似的是生成包含路线编号的字符串 . 此示例显示如何使用最近的JavaScript中提供的反引号来执行此操作,或者您可以执行字符串连接:
但是,如果您只是查找该路由中的信息,则可以设置对数据库的引用以包含路由,获取整个结果及其值,然后将其视为JavaScript对象 .
顺便说一句,我想指出你完全使用Promises . 这是一个很多人陷入困境的陷阱,你通过Promise查询 Value ,将其作为Promise履行的一部分处理,并在你的处理程序中返回Promise,做得很好 .
在webhook中使用异步调用firebase来获取总线信息 .
获取参数值 .
访问Firebase数据库 .
使用异步调用基于参数获取信息 .
使用承诺回复正确的回复 . 请参阅this以通过承诺回复 .
Promise将在获取数据库信息时在Firebase功能中使用 .