javascript - 使用 Google Assistant 从 Firebase 返回数据数组

标签 javascript arrays firebase firebase-realtime-database actions-on-google

我的 firebase 数据库的结构是这样的: 水果: 苹果,5 香蕉,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 failed. Was called 0 aruguments. expects at least 1.

我不知道在 Firebase.child 中放入哪个参数。如果我想让 Google 智能助理“说出”所有水果。下面是我的 firebase 结构的图片。

enter image description here

错误如下所示: enter image description here

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

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

最佳答案

正如错误消息所暗示的那样,正如您推测的那样,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,但在 Actions on Google 方面存在一些问题。

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

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

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

关于javascript - 使用 Google Assistant 从 Firebase 返回数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52068961/

相关文章:

javascript - Firebase 的云功能 : Enumerate DataSnapshot Properties

firebase - 尽管流返回对象,但 Flutter StreamProvider 仍返回 null

javascript - 当关键字后的表达式未计算为 promise 时, `await` 会发生什么情况?

javascript - 停止监听 Backbone 中的 DOM 事件

javascript - RxJS 1 array item into sequence of single items - 运算符

javascript - 如何重新加载javascript文件

使用堆栈空间的 Java 数组

javascript - 如何查找和更新对象数组中的值?

arrays - 在 3d 矩阵的第二维中排序

android - 从本地文件系统加载 google-services.json