Как следует из сообщения об ошибке, и, как вы догадываетесь, вызов 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, есть несколько проблем с этим на Действиях на стороне Google.
Во-первых, возвращаемое сообщение может иметь некоторые грамматические проблемы, поэтому на вашем примере вы можете увидеть сообщение типа «Число Apple, которое у вас есть: 1». Есть способы решить эту проблему, но имейте в виду, что мой пример кода является только начальным примером.
Более важно, однако, что вызов agent.add()
со строкой создает «SimpleResponse». Вам разрешено только два простых ответа за ответ в действии. Так что, хотя это будет работать для вашего примера, у вас будут проблемы, если у вас будет больше фруктов. Вы можете решить эту проблему, объединяя строки вместе, поэтому вы звоните agent.add()
только один раз.
Наконец, вы, возможно, захотите взглянуть на некоторые другие варианты ответа для разных поверхностей. Таким образом, хотя вы можете прочитать этот список на динамике, вы можете прочитать более короткий список на устройстве с экраном и показать таблицу с информацией. Однако подробности об этом лучше рассмотреть как новый вопрос StackOverflow.