Firebase 数组中的加法分配问题

Trouble with Addition Assignment in Array from Firebase

我有一个场景,我需要一次查询多个集合并根据集合名称检索值。我使用 Promise.all 这样做,它会像这样工作

var dbPromises = [];

  dbPromises.push(
    admin.firestore().collection("collection1").where("user_id", "==", uid).get(),
    admin.firestore().collection("collection2").where("user_id", "==", uid).get(),
    admin.firestore().collection("collection3").where("user_id", "==", uid).get(),
  );

  const promiseConst = await Promise.all(dbPromises);

promiseConst.forEach((qs) => {

        if (qs.size > 0) {
            if (qs.query._queryOptions.collectionId == "collection1") {
                qs.docs.map((doc) => {
                    valuesArr1.push(doc.data().arr);
                });
            } else if (qs.query._queryOptions.collectionId == "Collection2") {
                qs.docs.map((doc) => {
                    valuesArr2.push(doc.data());
                });
            } else if (qs.query._queryOptions.collectionId == "collection3") {
                qs.docs.map((doc) => {
                    valuesArr3.push(doc.data());
                });
            }
    } else {
        return 
    }
    
  });

for (var i=0; i < valuesArr1.length; i++) {
    if (valuesArr1[i].desiredData) {
        console.log('datas from for loop on datas array', valuesArr1[i].desiredData)
        globalVariable += `<img src="${valuesArr1[i].desiredData}">`; 
    }
 }

执行此操作后,我会映射我获得的查询快照,并且能够像这样检索到目前为止的值

从第一个集合中,我从 firestore 文档中检索了一个数组,然后我只从集合中检索了以下集合中的所有文档。这都是 'works',因为当我 console.log 进入功能控制台时,数据显示完全符合预期。只有当我想遍历数据并将结果分配给全局变量以在其他地方使用时,才会出现奇怪的行为。

console.log 在函数控制台中显示所需的数据没有问题,但是当我将该数据插入 html 并在 nodemailer 中发送时的输出我得到以下结果

当我使用 += 加法赋值运算符时,

undefined 始终是响应中的第一个,但是如果我只使用 = 赋值运算符,则没有 undefined 但我显然没有得到我期望的所有数据。

我正在检索的集合中没有未定义的值或文档,我已经彻底检查并删除了文档以确保这一点。经过几天的研究,我得出的结论是它与我正在使用的承诺的异步性质有关,并且在我迭代它时数据没有立即准备好。

有人可以帮助我了解我做错了什么以及如何在节点中修复它吗?

我找到了解决我的问题的方法并想分享它,希望它能为未来的观众节省一些时间。

之前,我将来自 Firebase 的数组结果存储在一个全局变量中。为了省去一些麻烦,我会 post 下面再写一遍代码。

var globalVariableArray = []

var globalVariable

var dbPromises = [];

dbPromises.push(
  admin.firestore().collection("DataCollection").where("user_id", "==", uid).get()
);

const promiseConst = await Promise.all(dbPromises);

promiseConst.forEach((qs) => {
    if (qs.size > 0) {
        if (qs.query._queryOptions.collectionId == "DataCollection") {
       Promise.all(
         qs.docs.map(doc => {
           globalVariableArray = doc.data().arrayWithDesiredData;
         })
       );
    } 
    else {
        return 
    }  
});

globalVariableArray.map(gv => {
  globalVariable += `<p>gv.desiredData</p>` // <--- Right here is where the problem area was
})

var mailOptions = {
    from: foo@blurdybloop.com,
    to: 'bar@blurdybloop.com
    subject: 'Almost but not quite',
    html: `${globalVariable}`
};

上面的代码给出了预期的输出,但在数据显示之前输出总是先有 undefined。无论如何迭代来自 Firebase 的数组,都会发生这种情况。

在加强我的Google-Fu之后,我制定了以下解决方案

var globalVariableArray = []

var globalVariable

var dbPromises = [];

dbPromises.push(
  admin.firestore().collection("DataCollection").where("user_id", "==", uid).get()
);

const promiseConst = await Promise.all(dbPromises);

promiseConst.forEach((qs) => {
    if (qs.size > 0) {
        if (qs.query._queryOptions.collectionId == "DataCollection") {
       Promise.all(
         qs.docs.map(doc => {
           globalVariableArray = doc.data().arrayWithDesiredData;
         })
       );
    } 
    else {
        return 
    }  
});

var mailOptions = {
    from: foo@blurdybloop.com,
    to: 'bar@blurdybloop.com
    subject: 'It works!!',
    html: `${globalVariableArray.map(dataIWantedAllAlong => <p>dataIWantedAllAlong.desiredData</p> )}` <--- Here I simply loop through the array inside the interpolation blocks and voila! no more undefined showing up in the results
};

我在插入动态数据的括号内执行循环,不再让讨厌的 undefined 出现在我的电子邮件中。

祝大家旅途平安,编程愉快!