使用异步Firestore数据库调用后无法发送数组作为响应

时间:2019-07-13 01:15:18

标签: javascript node.js firebase google-cloud-firestore google-cloud-functions

使用Node.js发送数组以响应Firebase函数。我无法发送数组。

我试图在循环中发送响应。它有效,但只发送一个值。

const admin = require('firebase-admin');
const functions = require('firebase-functions');

admin.initializeApp(functions.config().firebase);
let db = admin.firestore();
var dat =[];
var dat1 =[];

db.collection('users').get().then(function(snapshot){
  snapshot.forEach(element => {
  //  snapshot.forEach(function(doc){
  db.collection('users').doc(doc.id).collection('profile').doc(doc.id).collection("pet").doc(doc.id).get().then((snapshot) => { 

      //  dat.push(snapshot.data()['bio']+"");
    dat.push(element.id);
  });
  return snapshot;
})
  .catch((err) => {
    console.log('Error getting documents', err);
   });


  dat.forEach(element =>{
    db.collection('users').doc(element.id).collection('profile').doc(element.id).collection('pet').doc(element.id).get().then((snapshot) =>{
      dat1.push(snapshot.data()['bio']);
      return snapshot;
    }).catch((err) => {
      console.log('Error getting documents', err);
     });
  });

exports.helloWorld = functions.https.onRequest(function(request, response){
    response.send(dat1);
});

它始终显示为空,但其中应该有一个数组。

1 个答案:

答案 0 :(得分:0)

您不能简单地声明一些顶级代码并期望它们在函数被调用之前运行(并完成)。

调用该函数时必须执行的所有代码都应在exports.helloWorld函数内部,或从那里调用。

类似这样:

exports.helloWorld = functions.https.onRequest(function(request, response){
  var dat =[];
  var dat1 =[];

  db.collection('users').get().then(function(snapshot){
    snapshot.forEach(element => {
    //  snapshot.forEach(function(doc){

 db.collection('users').doc(doc.id).collection('profile').doc(doc.id).collection("pet").doc(doc.id).get().then((snapshot) => { 

        //  dat.push(snapshot.data()['bio']+"");
      dat.push(element.id);
    });
    return snapshot;
  })
    .catch((err) => {
      console.log('Error getting documents', err);
     });


    dat.forEach(element =>{
      db.collection('users').doc(element.id).collection('profile').doc(element.id).collection('pet').doc(element.id).get().then((snapshot) =>{
        dat1.push(snapshot.data()['bio']);
        return snapshot;
      }).catch((err) => {
        console.log('Error getting documents', err);
       });
    });
    response.send(dat1);
});

我不确定我是否了解helloWorld函数之外的代码结构,因此我只是将其复制/粘贴到上面的正确位置以显示需要发生的事情。