Как использовать, если еще l oop в диалоге для отображения результатов - PullRequest
1 голос
/ 03 февраля 2020

У меня есть Javascript код для Dialogflow, выполняющего проект в Google Actions. Для этого кода, если ответ находится в базе данных, значит, он ответит, иначе он выходит из приложения. Итак, я хочу использовать еще l oop для этого кода PLZ, помогите мне

    function handleCompanyDetails(agent){   
  const RegNo = agent.parameters.RegNo;
  var ref8 =  admin.database().ref().child("Table/");
  var query8 = ref8.orderByChild("RegNo").equalTo(RegNo);
 return query8.once("value")
  .then(function(snapshot) {  
   snapshot.forEach(function(child) {

    if( !snapshot.exists() ){
      // There are no results, say so
      agent.add("There are no results for that account.");

    } else {
      // ... Do something with the data
         agent.add(`The student placed in  ` + child.val().CompanyName);
    }

  });

 });        
 }

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Хотя вы можете использовать al oop для отображения результатов, есть несколько проблем с тем, как вы поступили, и, возможно, даже с тем, что вы пытаетесь вернуть.

Первый - Dialogflow требует, чтобы вы возвращали Promise от любой функции, которая выполняет асинхронный вызов, например, для вызова базы данных Firebase. В настоящее время вы используете метод обратного вызова. Вам следует переключиться на использование once(), которое вместо этого возвращает Обещание, чтобы это могло выглядеть примерно так:

return query8.once("value")
  .then( snapshot => {
    // working with snapshot goes here
  })
  .catch( err => {
    console.error(err);
    agent.add("There was a problem.");
  });

Второй - это то, как вы работаете с самим snapshot. Если вы ожидаете нескольких результатов, вы должны знать, что вы можете звонить только agent.add() с текстовым сообщением дважды и одной базовой c картой. Если вам нужно несколько карт, вы можете вместо этого использовать список или карусель.

Если вы ожидаете, что только один ответ индексируется по RegNo, что выглядит так, как если бы вы были Затем вы должны просто включить это как часть пути и получить значение снимка. В этом случае вам не понадобится al oop.

Обновление на основе обновленного кода.

Как вы заметили, вы ничего не отправляете, если есть результатов нет, поэтому действие завершается с ошибкой.

Самый простой способ сделать это - использовать snapshot.exists(), чтобы проверить, есть ли какие-либо результаты в снимке. Если их нет, вы можете вернуть ошибку. Это может выглядеть примерно так:

return query8.once("value")
  .then(function(snapshot) {  

    if( !snapshot.exists() ){
      // There are no results, say so
      agent.add("There are no results for that account.");

    } else {
      // ... Do something with the data
    }

  });
  // ...

Если у вас действительно есть результаты, у вас все еще есть проблема, что вы, возможно, отправляете слишком много ответов. У вас может быть только одна agent.add() с сообщением, которое нужно произнести (максимум два, но не делайте этого), и только одна Карта, если вы не используете Список или Карусель. Так что было бы лучше, чтобы вы создали это сообщение внутри l oop.

0 голосов
/ 03 февраля 2020

Используйте .then () при выполнении операций со снимком. Потому что .once () срабатывает только один раз, поэтому, если данные доступны, будет выполняться значение .then (), и вы можете выйти из него с помощью .catch (). проверьте код ниже.

function handleCompanyDetails(agent){   
  const RegNo = agent.parameters.RegNo;
  var ref8 =  admin.database().ref().child("Table/");
  var query8 = ref8.orderByChild("RegNo").equalTo(RegNo);
  return query8.once("value")
     .then(function(snapshot) {  
          snapshot.forEach(function(child) {
              agent.add(`The student placed in  ` + child.val().CompanyName);
              agent.add(new Card({
                  title: ` Name:${child.val().Studentname}
                  Reg No: ${child.val().RegNo}
                  Offer Date: ${child.val().OfferDate} `, 
                  imageUrl: '',
                  text:  `Thanks for using ?\n  ${child.val().FirstName} ?`,
                  buttonText: '.com'
              })
           })
        })
     .catch( // throw some error)
    }

Вы можете прочитать больше здесь, https://firebase.google.com/docs/database/web/read-and-write

...