我在Firebase中有一个实时数据库,并在Google Cloud的Dialogflow中设置了一个代理。该代理程序代理正在获取有关总线路由名称的数据。向最终用户询问公交车号,代理商应根据该路线号获得相关信息。我可以拨打数据库,但只能拨打设定的总线号。
因此,例如在下面的示例中,我可以基于将100
设置为snapshot.child
来获取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);
答案 0 :(得分:0)
在Webhook中,使用异步调用firebase来获取总线信息。
答案 1 :(得分:0)
通常,处理此问题的最佳方法是引用总线号的节点,作为设置查询路径的一部分。得到结果后肯定会得到它,但是这意味着您要为每个查询提取很多个数据。
但是有几种方法可以做到这一点。
与您现在的操作最相似的方法是生成一个包含路由号的字符串。此示例显示了如何使用反引号(在最新的JavaScript中可用)执行此操作,或者您也可以执行字符串连接:
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(`${bus}/route_desc`).val();
var routeName = snapshot.child(`${bus}/route_long_name`).val();
agent.add(`Bus info is ` + routeInfo + ' and is called ' + routeName);
但是,如果您只是从该路由中查找信息,则可以设置对数据库的引用以包括该路由,获取整个结果及其值,然后将其视为JavaScript对象。
function handleBus(agent) {
const bus = agent.parameters.bus;
agent.add(`Thank you...`);
return admin.database().ref('Routes').child(bus).once("value").then((snapshot) => {
var route = snapshot.val();
var routeInfo = route['route_desc'];
var routeName = route['route_long_name'];
agent.add(`Bus info is ` + routeInfo + ' and is called ' + routeName);
顺便说一句,我想指出您正在完美地使用Promises。这是很多人陷入的陷阱,并且您已经很好地通过Promise查询了值,将其作为Promise履行的一部分进行处理,并在处理程序中返回Promise。