Возврат массива данных с помощью Google Assistant из Firebase - PullRequest
0 голосов
/ 29 августа 2018

Структура моей базы данных 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 не удалось. Был назван 0 aruguments. ожидает как минимум 1.

Я не знаю, какой аргумент поместить в Firebase.child. если я хочу, чтобы все фрукты были "сказаны" помощником Google. Ниже изображение моей структуры базы огня.

enter image description here

Ошибка выглядит следующим образом: enter image description here

То, что я сейчас делаю для вывода плодов, - это ввод вручную каждого дочернего элемента в код, подобный этому, и удаление «.child» в выражении return: enter image description here

Это дает мне вывод ниже, который также является тем, что я хочу видеть, но использование массивов в качестве решения, которое я использую сейчас, очень жестко закодировано: enter image description here

1 Ответ

0 голосов
/ 30 августа 2018

Как следует из сообщения об ошибке, и, как вы догадываетесь, вызов 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...