Javascript Firebase函数成功完成1-2次,然后抛出错误:无法修改已提交的写回
我使用批处理写入Javascript Firebase函数成功完成1-2次,然后抛出错误:无法修改已提交的写回,javascript,firebase,google-cloud-firestore,google-cloud-functions,es6-promise,Javascript,Firebase,Google Cloud Firestore,Google Cloud Functions,Es6 Promise,我使用批处理写入firestore,我的firebase函数总是在第一次尝试时成功执行 i functions: Beginning execution of "myFunction" i functions: Finished "myFunction" in ~1s i functions: Beginning execution of "myFunction" API fetch ... Amount of rec
firestore
,我的firebase函数总是在第一次尝试时成功执行
i functions: Beginning execution of "myFunction"
i functions: Finished "myFunction" in ~1s
i functions: Beginning execution of "myFunction"
API fetch ...
Amount of records to process: 3600
filled batch (amount of writes: 490)
filled batch (amount of writes: 490)
...
All batches commited to Firebase
imported batch
imported batch
...
i functions: Finished "myFunction" in ~33s
错误总是在第二次或第三次执行函数时发生,并显示以下错误消息:
Unhandled error Error: Cannot modify a WriteBatch that has been committed.
我使用批处理的方法包括两个步骤
我创建了一个包含批处理的数组,并将490次写入传递给每个批处理
我执行wait Promise.all()中的每个提交操作
我想我的错误在第二步中。我尝试了承诺链接和异步等待:
异步/等待:
试试看{
等待承诺.all(batches.map(batch=>batch.commit())
console.log('提交给Firebase的所有批')
}捕获(错误){
console.log(错误)
}
承诺链:
wait Promise.all(batches.map)(batch=>{
返回batch.commit().then(函数(){
console.log(“导入的批处理”)
});
}))
.then(console.log(“提交给Firebase的所有批次”))
.catch(err=>console.log(err))
批次数组本身是这样创建的,我在循环中多次调用以下函数:
function useBatches(collectionRef, action, type, docId, data) {
const docRef = collectionRef.doc(docId);
switch(action) {
case 'delete':
batches[batchIndex].delete(docRef);
break;
case 'update':
batches[batchIndex].update(docRef, data);
break;
case 'set':
batches[batchIndex].set(docRef, data);
break;
}
batchSizeCounter++;
totalWritesToDo--
// create batches
if (batchSizeCounter === BATCH_SIZE) {
console.log(`filled batch (amount of writes: ${batchSizeCounter})`)
batches.push(db.batch());
batchIndex++;
batchSizeCounter = 0;
}
// inform about last batch was filled
if (totalWritesToDo === 0) {
console.log(`filled batch (amount of writes: ${batchSizeCounter})`)
return;
}
}
我非常感谢你的帮助 请编辑问题以显示完整的最小代码。我们根本看不到您是如何创建和处理批次的。我们应该能够获取您提供的代码并自己运行它,以观察相同的行为。我建议阅读:@DougStevenson谢谢你的反馈,我已经更新了我的问题我仍然不知道你在哪里声明批处理
,所以我无法复制此代码来运行它。你在这里所做的就是把事情推进去,并做出承诺。错误消息告诉您,在已提交批处理对象之后,无法提交该对象。您可能希望简化此代码,以便更清楚地了解这些批处理实际上是如何工作的。奇怪的是,它发生在第二次或第三次之后。第一次总是成功的。是的,你在这里做错了什么,但是没有足够的信息来确切知道什么,因为你没有显示所有的代码。请编辑问题以显示完整的最小代码。我们根本看不到您是如何创建和处理批次的。我们应该能够获取您提供的代码并自己运行它,以观察相同的行为。我建议阅读:@DougStevenson谢谢你的反馈,我已经更新了我的问题我仍然不知道你在哪里声明批处理
,所以我无法复制此代码来运行它。你在这里所做的就是把事情推进去,并做出承诺。错误消息告诉您,在已提交批处理对象之后,无法提交该对象。您可能希望简化此代码,以便更清楚地了解这些批处理实际上是如何工作的。奇怪的是,它发生在第二次或第三次之后。第一次总是成功的。是的,你在这里做错了什么,但是没有足够的信息来确切知道是什么,因为你没有显示所有的代码。