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