Неудачная транзакция в цикле forEach - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь обновить несколько документов Firestore, основываясь на результате стороннего сервиса внутри транзакции.Проблема в том, что я получаю следующую ошибку:

Ошибка: Невозможно изменить зафиксированный WriteBatch.

Вот мой код:

export default async function debitDueTransactions(context: any) {
  const now = new Date().getTime();
  return db.runTransaction(async (transaction: FirebaseFirestore.Transaction) => {
    const chargesToCaptureRef = db.collection(`charges_to_capture`)
      .where('dateToCapture', '>=', now)
      .where('dateToCapture', '<=', (now + 86400000))
      .where('captureResult', '==', null);
    return transaction.get(chargesToCaptureRef).then((chargeToCaptureQuerySnap: FirebaseFirestore.QuerySnapshot) => {
      chargeToCaptureQuerySnap.forEach(async (doc: FirebaseFirestore.QueryDocumentSnapshot) => {
        const chargeToCapture = <ChargeToCapture>doc.data();
        chargeToCapture.id = doc.id;
        let errorKey = null;
        // Calling third party service here, waiting response
        const captureResult = await captureCharge(chargeToCapture.chargeId).catch((error: any) => {
          errorKey = error.code ? error.code : 'unknown_error';
        });
        transaction.update(doc.ref, { captureResult: captureResult, errorKey: errorKey });
      });
      return new Promise((resolve) => { resolve(); });
    })
  });
}

Не можете понять, что я делаю неправильно, любая идея?

1 Ответ

0 голосов
/ 24 апреля 2019

Как видно из документации API, транзакция.get () принимает только объект типа DocumentReference.Вы передаете ему объект Query.Транзакция Firestore не может совершать транзакции с Query.Если вы хотите провести транзакцию по всем документам, возвращаемым из запроса, вы должны выполнить запрос до транзакции, а затем использовать транзакцию.get () для каждой ссылки на документ по отдельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...