我的firebase数据库的结构是这样的:fruits:apple,5 banana,6
我想将苹果和香蕉放在一个数组中,这样当我向Google智能助理发出命令时,它会给我苹果,5和香蕉,6。我的代码如下所示:
function handleCommand(agent) {
return admin.database().ref('Fruits').child().once("value").then((snapshot) =>{
var i;
var fruitlist=[];
//puts each snapshot child of 'Fruit' in an array
snapshot.forEach(function(item) {
var itemVal = item.val();
fruitlist.push(itemVal);
});
//outputs command in google assistant
for (i=0; i < fruitlist.length; i++) {
agent.add(fruitlist[i]);
}
})
默认响应为“不可用”。
我在执行日志中得到以下内容:
Firebase.child失败了。被称为0 ar。预计至少1。
我不知道在Firebase.child中放入哪个参数。如果我想让Google智能助理“说出”所有水果。下面是我的firebase结构的图片。
正如错误消息所示,并且正如您所推测的那样,child()
调用需要一个参数 - 特别是您想要从中获取信息的子节点的名称。但是,由于您需要“Fruits”节点的所有子节点 - 您根本不需要指定它。 child()
调用只是在层次结构中向下导航,但如果您不想,则根本不需要导航。
您获取的快照将具有整个对象的值。在某些情况下,这可能非常大,因此一次性完成所有操作并不是一个好主意。在你的情况下,它是相当小的,所以没有那么大的交易。
在JavaScript方面,您现在可以将该值作为具有属性和值的对象来处理。您的原始代码并没有完全按照您的意愿执行,但是 - 您获得了值,但忽略了名称(属性名称或键)。您可以通过多种方式迭代对象的属性,但我喜欢获取对象的键,循环遍历此对象,获取与键关联的值,然后使用它“执行某些操作”。
虽然我没有测试过代码,但它可能看起来像这样:
function handleCommand(agent) {
return admin.database().ref('Fruits').once("value").then((snapshot) =>{
// Get an object with all the fruits and values
var fruits = snapshot.val();
// Get the keys for the attributes of this object as an array
var keys = Object.keys( fruits );
// Iterate over the keys, get the associated value, and do something with it
for( var i=0; i<keys.length; i++ ){
var key = keys[i];
var val = fruits[key];
agent.add( `The number of ${key} you have are: ${val}` );
}
})
虽然这是(或应该)使用Firebase和JavaScript,但Google上的操作方面存在一些问题。
首先,返回的消息可能存在一些语法问题,因此使用您的示例,您可能会看到一条消息,例如“您拥有的Apple数量:1”。有办法解决这个问题,但请记住,我的示例代码只是一个入门示例。
然而,更重要的是,用字符串调用agent.add()
会创建一个“SimpleResponse”。在Action中,每个回复只允许两个简单的响应。因此,虽然这对你的例子有用,但如果你有更多的水果会有问题。您可以通过将字符串连接在一起来解决这个问题,因此您只需调用一次agent.add()
。
最后,您可能希望实际查看不同曲面的其他一些响应选项。因此,虽然您可能会在扬声器上读出此列表,但您可以在带有屏幕的设备上阅读较短的列表,并显示包含该信息的表格。但是,有关这些的详细信息可能会作为新的StackOverflow问题得到更好的解决。