我的防火墙数据库的结构如下:水果:苹果,5根香蕉,6
我想把苹果和香蕉放在一个数组中,这样当我命令谷歌助理时,它就会给我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失败。被称为零薪酬。预计至少有1人。
我不知道在Firebase.child中放哪个论点。如果我希望所有的水果被谷歌助理“说”。下面是我的消防基地结构的图片。

该错误如下所示:

我现在要做的只是输出水果,在代码中手动输入每个子程序,然后删除返回语句中的".child“:

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

发布于 2018-08-30 12:39:31
正如错误消息所暗示的那样,正如您推测的那样,child()调用需要一个参数--特别是要从子节点获取信息的名称。但是,因为您想要“果树”节点的所有子节点,所以根本不需要指定它。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,但谷歌方面的操作存在一些问题。
首先,返回的消息可能有一些语法问题,因此使用您的示例,您可能会看到一条消息,如“您拥有的Apple的数量是: 1”。有解决这个问题的方法,但请记住,我的示例代码只是一个初始示例。
然而,更重要的是,使用字符串调用agent.add()创建了一个"SimpleResponse“。在一个操作中,每个回复只允许两个简单的响应。因此,虽然这对你的例子是有效的,但如果你有更多的成果,它会有问题。您可以通过将字符串连接在一起来解决这个问题,因此您只需要调用agent.add()一次。
最后,您可能希望实际查看不同曲面的一些其他响应选项。所以,当你在扬声器上读出这个列表时,你可以在一个带有屏幕的设备上读取一个更短的列表,并显示一个包含这些信息的表格。然而,有关这些问题的细节可能最好作为一个新的StackOverflow问题来解决。
https://stackoverflow.com/questions/52068961
复制相似问题