代码之家  ›  专栏  ›  技术社区  ›  lolhaha

使用Google助手从Firebase返回数据数组

  •  1
  • lolhaha  · 技术社区  · 6 年前

    firebase数据库的结构如下: 水果: 香蕉,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阿鲁古门特。至少应为1。

    我不知道该把哪个论据放在Firebase.child文件. 如果我想让所有的水果都被谷歌助手说出来。下面是我的火基结构图片。

    enter image description here

    错误如下所示: enter image description here

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Prisoner    6 年前

    正如错误消息所暗示的,并且正如您所猜测的 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端的操作上存在一些问题。

    首先,返回的消息可能有一些语法问题,因此使用您的示例,您可能会看到一条消息,例如“the number of Apple you have are:1”。有很多方法可以解决这个问题,但是请记住我的示例代码只是一个入门示例。

    agent.add() 使用字符串创建“SimpleResponse”。在一个操作中,每个回复只允许有两个简单的响应。所以,虽然这对你的例子有用,但如果你有更多的水果,就会有问题。您可以通过将字符串连接在一起来解决这个问题,这样您只需调用 一次。

    最后,您可能希望实际查看不同曲面的一些其他响应选项。因此,虽然您可以在扬声器上读取此列表,但您可以在带有屏幕的设备上读取较短的列表,并显示包含信息的表格。不过,有关这些的细节最好作为一个新的StackOverflow问题来解决。