【问题标题】:Dialogflow: How do I pass a parameter through in a Firebase query?Dialogflow:如何在 Firebase 查询中传递参数?
【发布时间】:2018-08-19 11:54:20
【问题描述】:

我在 Firebase 中有一个实时数据库,并在 Google Cloud 的 Dialogflow 中设置了一个代理。此代理代理正在获取有关公交路线名称的数据。最终用户被要求提供巴士号码,并且代理应该根据该路线号码获取相关信息。我可以调用数据库,但只能调用一个设定的巴士号码。

例如,下面我可以基于将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);

【问题讨论】:

    标签: firebase firebase-realtime-database dialogflow-es


    【解决方案1】:

    一般来说,处理此问题的最佳方法是在设置查询路径时引用总线编号的节点。获得结果后获取它当然是可能的,但这意味着您提取的数据比每次查询所需的数据多很多

    但是有几种方法可以做到这一点。

    与您现在的做法最相似的是生成一个包含路线编号的字符串。这个例子展示了如何使用反引号来做到这一点,它在最新的 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。

    【讨论】:

    • 感谢您的帮助。这行得通!这句话是什么意思:一般来说,处理这个问题的最佳方法是引用总线号的节点作为设置查询路径的一部分。
    • 对不起,我含糊其辞。我说的是我在我给出的第二个例子中说明的内容。
    【解决方案2】:

    在 webhook 中使用对 firebase 的异步调用来获取总线信息。

    • 获取参数值。
    • 访问 Firebase 数据库。
    • 使用异步调用根据参数获取信息。
    • 使用 promise 以正确的响应回复。请参阅 this 以通过 Promise 回复。
    • 当您的 Firebase 函数获取 DB 信息时,Promise 将被使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      相关资源
      最近更新 更多