Dialogflow:如何在Firebase查询中传递参数?

时间:2018-08-19 11:54:20

标签: firebase firebase-realtime-database dialogflow

我在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);

2 个答案:

答案 0 :(得分:0)

在Webhook中,使用异步调用firebase来获取总线信息。

  • 获取参数值。
  • 访问Firebase数据库。
  • 使用异步调用基于参数获取信息。
  • 使用Promise进行正确回复。请参阅this以了解通过诺言做出的回应。
  • Promise将在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。