【问题标题】:How read data by Dialogflow on FirebaseFirebase 上的 Dialogflow 如何读取数据
【发布时间】:2020-03-11 12:39:46
【问题描述】:

我使用对话流聊天机器人,但是当我尝试从 DB firebase 带书时,我应该写下密钥!!

picture for DB
我想读所有的钥匙! 但在这种情况下,我必须声明带数据的密钥(-LsDnHZFnJ1Iz5sGsRKu)like this

 function handlecat(agent){
   return admin.database().ref('Books/-LsDnHZFnJ1Iz5sGsRKu').once("value").then((snapshot) => {
     agent.add(`in ` + snapshot.child('title').val() );
   });
 }

我怎样才能自动循环!? 我用这个代码

admin.database().ref('Books').once("value").then((snapshot) => {
let books = snapshot.val();
books.forEach(function(element) {
    agent.add(element.child('title').val()); /// and I use element.title
});
});
}

但是不行!!

【问题讨论】:

  • 请不要将您的代码显示为图形,因为它使阅读和测试变得非常困难。请更新您的问题以显示您正在使用的所有代码,以及您遇到的任何错误,或您尝试执行或获得的内容的描述。您提供给我们的信息越多,我们就越有可能帮助您做您想做的事情。
  • 问题已更新为我用来带来数据的好东西

标签: node.js firebase-realtime-database dialogflow-es firebase-admin


【解决方案1】:

如果您想要“Book”的所有子项,那么您可以获得对该路径的引用,在其上调用once(),并获取返回的快照的val()。这应该为您提供一系列书籍。像这样的:

admin.database().ref('Books').once("value").then((snapshot) => {
  let books = snapshot.val();
});

这将是一个 JavaScript 数组,因此您无需从服务器重新获取所有内容。你可以使用普通的 JavaScript 方法来访问它,所以如果你想要的每本书都有一个“标题”属性,你可以用类似的东西来获得它

books.forEach( element => {
  console.log( element.title );
} );

但是如果您在该数组中有很多项目,这可能会非常大。并且可能需要一段时间才能获取并存储大量内存。如果您是,有多种方法可以使用working with lists of data,包括使用排序和过滤方法,例如orderByChild()limitToFirst(),具体取决于您的需要。

获得此值后,您还需要将其发送给用户,因为听起来您正在使用 Dialogflow。一个问题是您不能只为每个项目调用 agent.add(),因为 Dialogflow 的某些集成只支持调用一次 agent.add(),这可能会创建一长串在聊天代理中不太有用的标题。考虑如何将其缩小到您可能想要报告的一个或几个标题。所以可能是这样的

if( books.length === 0 ){
  agent.add( `There are no books.` );
} else if( books.length === 1 ){
  agent.add( `There is one book named ${books[0].title}` );
} else {
  agent.add( `There are ${books.length} books including one named ${books[0].title}` );
}

【讨论】:

  • 请不要尝试在 cmets 中显示代码 - 用代码更新原始问题以及它如何“不起作用”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多