Firebase + DialogFlow - база данных в реальном времени - облачная функция возвращает результат запроса только после второго запроса - PullRequest
0 голосов
/ 29 ноября 2018

Я пишу простое действие Google, которое будет читать базу данных Firebase Realtime и возвращать результат в ответе.Моя проблема в том, что результат запроса передается обратно в ответ на DialogFlow только после как минимум 2 попыток.Под снимками экрана, показывающими конечный результат в Simulator Первый снимок экрана Первая строка ответа возвращается из Облачной функции и содержит значения, переданные с помощью "Контекст".В этом ответе нет второй строки.

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

Похоже, мой код "работает" (яполучить правильные данные из базы данных), но по какой-то причине это работает, только если я запускаю его как минимум 2 раза подряд.

Ниже приведен фрагмент кода, который обрабатывает этот запрос:

  function googleAssistantHandler(agent) {
   let conv = agent.conv();  
   let outCommandContext = agent.getContext('outcommand');
   let outCharacterContext = agent.getContext('outcharacter');
   let character = outCharacterContext.parameters.character;
   let command = outCommandContext.parameters.command;
   agent.add('<prosody rate="140%" pitch="0.4">' + character +' '+ command +'</prosody>');  
   var movesRef = admin.database().ref('characters/'+character.toLowerCase()+'/moves/'); 

   movesRef.limitToFirst(1).orderByChild("notation")
   .equalTo(command.toString()).on("child_added",function(snapshot){      
   agent.add(`record number is ` + snapshot.key);  
 }); 

}

Я попытался использовать один раз () вместо on () (как это было бы более целесообразно в моем случае ..)Мне не нужно слушать изменения в базе данных, я просто хочу получить данные один раз) - но я не смог заставить их работать.

Можете ли вы, ребята, помочь мне понять почему мой запрос возвращает результат только после второго триггера?Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

При работе с базами данных необходимо всегда использовать обещания.Более того, первый ответ, который вы видите, может быть из-за сбоя функции, которая истекла.Если вы видите журналы вашей консоли в firebase, вы можете увидеть ошибки.Также проверьте ваш ответ по умолчанию, если он имеет текст User said $name или что-то подобное, то это то, что вызывает проблему с первой попытки.Если вы все еще не получаете его, попробуйте зарегистрировать возвращенные данные и опубликуйте свои журналы здесь.

0 голосов
/ 29 ноября 2018

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

return movesRef.limitToFirst(1).orderByChild("notation")
             .equalTo(command.toString()).on("child_added").then(snapshot= > {      
                      agent.add(`record number is ` + snapshot.key);          
                       });
...