使用Firebase中的Google智能助理返回数据数组

问题描述 投票:1回答:1

我的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结构的图片。

enter image description here

错误如下所示:enter image description here

我现在正在做的只是输出水果是手动输入代码中的每个孩子,并在return语句中删除“.child”:enter image description here

这给了我下面的输出也是我想看到的但是使用数组作为我现在使用的解决方案非常硬编码:enter image description here

javascript arrays firebase firebase-realtime-database actions-on-google
1个回答
1
投票

正如错误消息所示,并且正如您所推测的那样,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问题得到更好的解决。

© www.soinside.com 2019 - 2024. All rights reserved.