Javascript 我的firebase云函数没有';t在插入表行的嵌套foreach中执行代码

Javascript 我的firebase云函数没有';t在插入表行的嵌套foreach中执行代码,javascript,google-cloud-firestore,google-cloud-functions,exceljs,Javascript,Google Cloud Firestore,Google Cloud Functions,Exceljs,创建“索引”表并包含其所有数据,创建标题为“产品代码”的表,但完全为空。内部foreach循环中的console log函数在每次迭代中都会打印数据,但是insertRow函数不会用数据填充工作表。有人能告诉我我做错了什么吗 index.js const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config(

创建“索引”表并包含其所有数据,创建标题为“产品代码”的表,但完全为空。内部foreach循环中的console log函数在每次迭代中都会打印数据,但是insertRow函数不会用数据填充工作表。有人能告诉我我做错了什么吗

index.js

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

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

const fs = require('fs-extra')
const gcs = require('@google-cloud/storage')();

const path = require('path');
const os = require('os');

const ExcelJS = require('exceljs');



exports.createCSV = functions.firestore
  .document('reports/{reportId}')
  .onCreate(async (snap, context) => {

    // Step 1. Set main variables
    console.log("Began");
    const reportId = context.params.reportId;
    const fileName = `reports/${reportId}.xlsx`;
    console.log(fileName);
    const tempFilePath = path.join(os.tmpdir(), fileName);

    // Reference report in Firestore
    const db = admin.firestore();
    const reportRef = db.collection('reports').doc(reportId);

    // Reference Storage Bucket
    const storage = gcs.bucket('gs://stock-check-48f78.appspot.com');
    const workbook = new ExcelJS.Workbook();

    // Step 2. Query collection
    try {
      const querySnapshot = await db.collection('stores')
        .get();
      // create array of order data
      const indexWorksheet = workbook.addWorksheet("INDEX");

      querySnapshot.forEach(async doc => {
        //stores.push(doc.data());
        const rowValues = [];
        rowValues[1] = doc.data().code.toString();
        rowValues[2] = doc.data().name;
        rowValues[3] = doc.data().address;
        indexWorksheet.addRow(rowValues);
        const worksheet = workbook.addWorksheet(doc.data().code.toString());
        const storeId = doc.id;
        console.log("Store id is: " + storeId);

        const querySnap = await db.collection('stores').doc(storeId).collection('products').get();

        querySnap.forEach(async a => {
          //console.log(a.data());
          const productValues = [];
          productValues[1] = a.data().name;
          productValues[2] = a.data().packaging;
          productValues[3] = a.data().category;
          productValues[4] = a.data().stock.toString();
          productValues[5] = a.data().order.toString();
          productValues[6] = a.data().last_updated;
          worksheet.insertRow(1, productValues);

        });
      });

      // Step 4. Write the file to cloud function tmp storage
      console.log("Filename is: ");
      console.log(fileName);
      console.log(tempFilePath);
      const buffer = await workbook.xlsx.writeBuffer();
      await fs.outputFile(tempFilePath, buffer);
      console.log("Uploaded");

      // Step 5. Upload the file to Firebase cloud storage
      const file = await storage.upload(tempFilePath, {
        destination: fileName
      });
      console.log("Uploaded to bucket");

      return reportRef.update({
        status: 'complete'
      });

    } catch (err) {
      return console.log(err);
    }

  })


更新 我做了这些更改,但仍然得到了相同的结果…(请参见上面编辑的代码)

尝试使用promise.all

await Promise.all(querySnap.map(async a => {
      //console.log(a.data());
      const productValues = [];
      productValues[1] = a.data().name;
      productValues[2] = a.data().packaging;
      productValues[3] = a.data().category;
      productValues[4] = a.data().stock.toString();
      productValues[5] = a.data().order.toString();
      productValues[6] = a.data().last_updated;
      worksheet.insertRow(1, productValues);

    }));

您的代码需要返回一个承诺,该承诺只在所有异步工作完成后才能解析。现在,它只返回null,然后立即终止。当您将async/await与then/catch混合使用时,很难跟踪代码的运行方式。我强烈建议只使用async/await,以便更容易跟踪。Doug Stevenson是正确的,不管怎样,如果您使用的是
async
不需要使用
。那么
,只需继续使用async/Wait来获得更干净的代码谢谢这些信息人员…但是我按照您的建议做了一些更改,仍然得到了相同的结果。尽管如此,现在我得到了
TypeError:无法读取未定义的属性“Symbol(Symbol.iterator)”
克服了上面的错误,我做了一些更改,但仍然得到了空白的表单