Dialogflow и Firebase - итерация списка данных - PullRequest
0 голосов
/ 04 апреля 2020

Создание чат-бота, который рекомендует mov ie на основе жанра и других факторов. Попытка перебрать объект, полученный из базы данных реального времени Firebase в DialogFlow. Я использую forEach, но при срабатывании отображается «Недоступно».

Предпочтительно, чтобы функция отображала случайный элемент из списка, но я еще не дошел до этой части - любой совет по этому вопросу также будет оценен .

Ниже приведен мой код.

  function displayData(agent) {
      return ref.orderByChild("genre1").equalTo("Comedy").on("child_added", function(snapshot) {
          let obj = {};
          obj = snapshot.val();
          obj.forEach(function(childSnapshot) {
              var childData = childSnapshot.val();
              agent.add(childData.name);
          });
      });
    }

Ниже приведен пример базы данных

{
  "movies" : {
    "movie1" : {
      "genre1" : "Sci-Fi",
      "genre2" : "Horror",
      "name" : "Alien",
      "rating" : 84,
      "year" : 1979
    },
    "movie2" : {
      "genre1" : "Comedy",
      "genre2" : "Parody",
      "name" : "Airplane",
      "rating" : 97,
      "year" : 1980
    },
    "movie3" : {
      "genre1" : "Comedy",
      "genre2" : "Teen",
      "name" : "Superbad",
      "rating" : 88,
      "year" : 2007
    }
  }
}

1 Ответ

0 голосов
/ 04 апреля 2020

Основная проблема в том, что библиотека Dialogflow требует, чтобы вы возвращали Promise, однако вы используете версию обратного вызова вместо версии Promise для вызова. Вам нужно изменить это на что-то более похожее на

  function displayData(agent) {
    return ref.orderByChild("genre1").equalTo("Comedy").on("child_added")
      .then( snapshot => {
        // Do something with the snapshot
      });
  }

(вы, вероятно, также захотите использовать once("value") вместо on("child_added"), поскольку вам не нужно отправлять обновления в режиме реального времени.)

Хотя forEach(), вероятно, работает правильно, существует небольшая проблема: не все агенты возвращают весь текст, который был .add() редактирован. Так что вы, вероятно, захотите вызвать .add() только один раз.

Поскольку вы действительно хотите, чтобы один из этих детей выбирался случайным образом, вы можете просто обработать его как JavaScript объект, если у вас достаточно памяти. Таким образом, вы можете просто получить ключи с помощью Object.keys(obj), выбрать один из ключей случайным образом, а затем получить полное значение результата.

...