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谢谢你的反馈,我已经更新了我的问题我仍然不知道你在哪里声明
    批处理
    ,所以我无法复制此代码来运行它。你在这里所做的就是把事情推进去,并做出承诺。错误消息告诉您,在已提交批处理对象之后,无法提交该对象。您可能希望简化此代码,以便更清楚地了解这些批处理实际上是如何工作的。奇怪的是,它发生在第二次或第三次之后。第一次总是成功的。是的,你在这里做错了什么,但是没有足够的信息来确切知道是什么,因为你没有显示所有的代码。