Javascript 我的firebase云函数没有';t在插入表行的嵌套foreach中执行代码
创建“索引”表并包含其所有数据,创建标题为“产品代码”的表,但完全为空。内部foreach循环中的console log函数在每次迭代中都会打印数据,但是insertRow函数不会用数据填充工作表。有人能告诉我我做错了什么吗 index.jsJavascript 我的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(
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)”
克服了上面的错误,我做了一些更改,但仍然得到了空白的表单