Проблема с восстановлением информации из firestore и отправкой ее моему боту в DialogFlow - PullRequest
0 голосов
/ 06 июля 2019

Я написал этот кусок кода, чтобы создать рыночного бота с диалоговым потоком.Я также создал простую базу данных для сохранения информации о реальной корзине покупок моего пользователя в пожарном депо.Но когда я запускаю эту функцию во встроенном редакторе, мой бот отвечает только «Seu carrinho:» и ничего о восстановленной мной информации.Информация отображается правильно в консоли Firestore, показывая, что получение информации является правильным.Я думаю, что это проблема асинхронных функций, которую я не понимаю.Помогите?

function myfunction(agent){

     var opt = agent.parameters.number;

    if(opt == 1){
      agent.add(`Ver estoque`);
    }else if(opt == 2){
      agent.add(`Seu carrinho: `);

      const carrinho = db.collection('/Usuarios/Usuario1/Carrinho');
      var produtosCarrinho = carrinho.get()
        .then(snapshot => {
          snapshot.forEach(doc => {
            console.log(doc.id, '=>', doc.data());
            agent.add(`${doc.id} - ${doc.data().Quantidade} ${doc.data().Bloco} - ${doc.data.Preco}\n`);
          });
        })
        .catch(err => {
          console.log(err);
        });
    }else{
      agent.add(`errou`);
    }
  }

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Проблема в том, что вы звоните carrinho.get().then(...).catch(...), возвращает Обещание, которое хранится в produtosCarrinho, но вы ничего не делаете с этим Обещанием.

Самое главное, так как это является частьюОбработчик намерений, вам необходимо вернуть это обещание Диспетчеру обработчиков.Это значит, что он знает, что нужно дождаться выполнения Обещания (то есть - он вызывает функцию в части then()), прежде чем отправит ответ обратно пользователю.

Итак, выВы запускаете вызов базы данных, но ваша функция почти сразу же завершается и возвращается до завершения вызова, сообщая обработчику об отправке ответа пользователю.

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

return carrinho.get()
  .then(doc => {...})
  .catch(err => {...});
0 голосов
/ 06 июля 2019

Вы уверены, что путь сбора указан правильно? Кажется, что вы пытаетесь получить вложенную коллекцию, но я не могу быть уверен без структуры данных. Если я прав, что-то вроде:

function myfunction(agent){

     var opt = agent.parameters.number;

    if(opt == 1){
      agent.add(`Ver estoque`);
    }else if(opt == 2){
      agent.add(`Seu carrinho: `);

      const carrinho = db.collection('Usuarios').doc('Usuario1').collection('Carrinho');
      var produtosCarrinho = carrinho.get()
        .then(snapshot => {
          snapshot.forEach(doc => {
            console.log(doc.id, '=>', doc.data());
            agent.add(`${doc.id} - ${doc.data().Quantidade} ${doc.data().Bloco} - ${doc.data.Preco}\n`);
          });
        })
        .catch(err => {
          console.log(err);
        });
    }else{
      agent.add(`errou`);
    }
  }

должно работать. Я думаю, что просто удалив первый слеш, как это:

const carrinho = db.collection('Usuarios/Usuario1/Carrinho');

тоже будет работать

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