从Firestore中恢复信息并将其发送到DialogFlow中的我的机器人时出现问题

时间:2019-07-06 01:18:34

标签: javascript firebase google-cloud-firestore dialogflow chatbot

我编写了这段代码,以使用dialogflow打造一个市场机器人。我还创建了一个简单的数据库,以将有关用户的实际购物车的信息保存在firestore上。但是,当我在Inline Editor上运行此功能时,我的机器人仅回答“ 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 :(得分:0)

您确定收集路径正确吗?似乎您正在尝试获取子集合,但是如果没有数据结构,我无法确定。如果我是对的,则类似:

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');

也可以工作

答案 1 :(得分:0)

问题是您调用carrinho.get().then(...).catch(...)返回了一个Promise,该Promise存储在produtosCarrinho中,但是您对该Promise却不做任何事情。

最重要的是,由于这是Intent Handler的一部分,因此您需要将此Promise返回给Handler Dispatcher。这样一来,它就知道在将答复发送回用户之前,等待Promise兑现(即,它调用then()部分中的函数)。

所以发生的事情是您开始数据库调用,但是您的函数几乎立即完成并在调用完成之前返回,告诉处理程序将答复发送给用户。

对于您而言,它应该很容易修复。除了将Promise存储在您从未使用过的变量中之外,您还可以使用以下内容将其返回:

return carrinho.get()
  .then(doc => {...})
  .catch(err => {...});