Dialogflow:获取数组中Firestore集合的所有文档ID(javascript节点)

时间:2019-08-23 12:22:51

标签: javascript node.js dialogflow

我是javascript和firestore的菜鸟。

我一直在尝试从我的Firestore集合中检索所有文档ID。

例如。如果我的收藏夹中有两个文档,我想获取一个包含所有收藏夹中的文档ID的数组。 即:var myArray = ['HhYaTvok4qJaIAVI9R0','2AO4RbZ6K5Db4q3OSqi'];

我一直在尝试使用Firestore文档(https://github.com/firebase/snippets-node/blob/9ae3a00985b53025fdc82716046882af71b6009d/firestore/main/index.js#L622-L627)中的一些代码。

但它不会在对话流中检索任何内容

在index.js(嵌入式编辑器)中的代码下面。


// The function to get documents ids
const arraymaker = (db) => {
  let platformRef = db.collection('quiz');
    let all_doc = platformRef.get();
    return all_doc
      .then(snapshot => {
        var myArray =[];
          snapshot.forEach(doc => {
            myArray.push(doc.id);   
          });
        })
      .catch(err => {
        console.log('Error getting documents', err);
      });
  };

// database retrieve
 app.intent('Read Random Quizz', (conv) => {
   // Trying to get Data from firestone DB,
    //var myArray = ['HhYaTvok4qJaIAVI9dR0','2AO4RbZ6K5Db4q3OS7qi'];
    var myArray = arraymaker(db);
    var rand = myArray[Math.floor(Math.random() * myArray.length)];
    var platformRef = db.collection("quiz").doc(rand);
    return platformRef.get()
             .then( snap => {
               var dat = "";
               var answ = "";
                 if (snap.exists) {
                   dat =  snap.data().question;
                   answ =  snap.data().answer;
                 }
               // This is the response for Actions on Google
                reply(conv,`The question is ${dat} and the answer is ${answ}`);
            })
            .catch( err => {
              console.log("error...", err);
            });
 });

我认为问题来自:

var myArray = arraymaker(db);

它只是不返回带有所有文档ID的myArray。

当我单独运行该函数时,我可以看到一个Firestore将所有ID附加到一个数组中,但是仅在Firestore日志中。它不会返回不在会话流中的最终myArray。

再次,我是JavaScript以及firestore的菜鸟。 任何建议或意见将不胜感激!提前非常感谢您!

2 个答案:

答案 0 :(得分:1)

您必须在秒示例中返回all_doc。 app.intent必须像第一个示例一样返回诺言,而在第二个示例中您将不返回任何内容。

此外,您还可以用console.log覆盖myArray!并为每个文档调用回复,我对firestore并不熟悉,但是我认为您必须为每个文档调用回复并更改覆盖myArray

<MDMenuItem>:
    on_release:
        ...
        app.root.menu_button.text = self.text

<MyScreen>:
    ...
            MDRaisedButton:
                id: mainbutton
                ...
                on_release:
                    root.menu_button = mainbutton
                    MDDropdownMenu(items=root.menu_items, width_mult=4).open(self)

            MDRaisedButton:
                id: secondbutton
                ...
                on_release:
                    root.menu_button = secondbutton
                    MDDropdownMenu(items=root.menu_items, width_mult=4).open(self) 

答案 1 :(得分:0)

我做到了,这似乎行得通。最初,我想要的是检索随机文档,所以我要粘贴找到的解决方案。如前所述,我是javascript的菜鸟,这可能是一个非常糟糕的代码。因此,任何关于如何改善此问题的建议都将受到欢迎。


var GlobalVariable;

// The function to get documents ids in an array called GlobalVariable
const arraymaker = () => {
  let platformRef = db.collection('quiz');
    let all_doc = platformRef.get();
    return all_doc
      .then(snapshot => {
        var myArray =[];
          snapshot.forEach(doc => {
            myArray.push(doc.id);
      GlobalVariable= myArray;       
          });
        })
      .catch(err => {
        console.log('Error getting documents', err);
      });
  };


// database retrieve
 app.intent('Read Random Quizz', (conv) => {
    arraymaker(); // restart function to get all the IDs in an array
    // take a random ID and read the document   
    var rand = GlobalVariable[Math.floor(Math.random() * GlobalVariable.length)];
    var platformRef = db.collection("quiz").doc(rand);
    return platformRef.get()
             .then( snap => {
               var dat = "";
               var answ = "";
                 if (snap.exists) {
                   dat =  snap.data().question;
                   answ =  snap.data().answer;
                 }
               // This is the response for Actions on Google
                reply(conv,`The question is ${dat} and the answer is ${answ}`);
            })
            .catch( err => {
              console.log("error...", err);
            });
 });