«Ошибка: невозможно изменить зафиксированный пакет записи». при попытке использовать пакетную запись в функции firebase - PullRequest
0 голосов
/ 06 мая 2020

Итак, я пытаюсь использовать пакетную запись в моей функции firebase для пакетной записи в пакетах по 500 штук. Однако по какой-то причине я получаю сообщение об ошибке «Ошибка: невозможно изменить записанный пакет, который был зафиксирован». и, кажется, не могу заметить, что делаю неправильно. Он сохраняет первые несколько результатов, но после этого выдает ошибку в моем журнале облачных функций. Любые предложения будут оценены = 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 Ответ

2 голосов
/ 07 мая 2020

Пакетный процесс должен состоять из двух частей: основной функции и обратного вызова из каждого пакета. Проблема в том, что вы пытаетесь повторно объявить пакетный процесс после того, как он был зафиксирован для первого пакета. создайте новый пакет или выделите его в специальной функции c, как в примере из документации.

Вот некоторые ресурсы, которые могут вам помочь:

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

Как выполнить массовое обновление в Firestore

Пакетная запись в облачный хранилище firebase

* для тех, кто прокомментировал, это довольно минимальная структура, в ней отсутствует дополнительная информация о масштабе. это может помочь, если вы умеете читать, а не запугивать, чтобы вырезать код только потому, что вы ленивы.

...