“错误:无法修改已提交的WriteBatch。”尝试在Firebase函数中使用批量写入时

时间:2020-05-06 07:28:44

标签: javascript firebase google-cloud-firestore google-cloud-functions

因此,我尝试在firebase函数中使用批处理写入,以500为批处理对我的写入进行批处理。但是由于某种原因,我收到了错误“错误:无法修改已提交的WriteBatch”。而且似乎无法发现我在做什么错。它存储的是前几个结果,但是此后它在云功能日志中给了我错误。任何建议将不胜感激= D


          messages.forEach((item, index) => {
            var all = _.find(item.parts, { which: "" });
            var id = item.attributes.uid;
            var idHeader = "Imap-Id: " + id + "\r\n";
            // eslint-disable-next-line handle-callback-err
            simpleParser(idHeader + all.body, (err, mail) => {
              // access to the whole mail object
              console.log(mail.subject);
              console.log(mail.html);

              let newDate = mail.date.valueOf();

              batch.set(
                docRef,
                {
                  Emails: admin.firestore.FieldValue.arrayUnion(
                    JSON.stringify({
                      subject: mail.subject,
                      body: mail.text,
                      date: newDate,
                      from: mail.from,
                    })
                  ),
                  //....
                },
                { merge: true }
              );
              if (
                (index % 500 === 0 && index > 0) ||
                index === messages.length - 1
              ) {
                return batch.commit().then(() => {
                  return console.log("SUCCESS");
                });
              }
            });
          });


1 个答案:

答案 0 :(得分:2)

批处理过程需要包含两个部分,一个主函数和每个批处理的回调。 问题是一旦对第一批提交后,您正试图重新声明该批处理。创建新批处理或将其分开使用特定功能(如文档示例)。

这里有一些资源可以帮助您:

https://medium.com/@michael.kimpton/batch-processing-with-firebase-cloud-functions-aa11640cc9ac

How to do a bulk update in Firestore

Batch write to firebase cloud firestore

*对于那些发表评论的人,这是一个相当小的结构,它缺少额外的范围信息。如果您只是因为懒惰而可以阅读并且不欺负地剪掉代码,这可能会有所帮助。