如何通过Dialogflow在Firebase上读取数据

时间:2019-11-15 11:03:44

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

我使用对话流聊天机器人,但是当我尝试从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
});
});
}

但是不行!

1 个答案:

答案 0 :(得分:1)

如果需要“ Book”的所有子代,则可以获取对该路径的引用,在其上调用once(),并获取返回的快照val()。这应该给您一本书。像这样:

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

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

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}` );
}