Firestore idempotency для виртуального кошелька - PullRequest
0 голосов
/ 21 февраля 2019

Я снова приду к вам, ребята, за помощью.У меня есть приложение, в котором вы можете пополнить свой виртуальный кошелек с помощью кредитной карты.

Моя структура подписчиков:

  • collection transactions/{transactionId} - содержит владельцаUID и сумма пополнения.
  • коллекция users/{userId}/personal/wallet, содержащая { funds: 0 }

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

В любом случае, у меня есть триггер onCreate с именем walletSync для новых документов в коллекции transactions, из которого я беру сумму и добавляю ее к текущим средствам пользователя через runTransaction.

Проблема в том, что функция иногда запускается трижды ... для одного документа.Вот скриншот.Я зарегистрировал транзакции ID (это всего лишь один документ) и, как вы можете видеть, onCreate обрабатывается три раза, поэтому мой кошелек пополняется в три раза реальным значением.

Вот мой код функции,в которой я отмечаю любую обработанную транзакцию processed: true, чтобы я мог проигнорировать ее в следующий раз, когда она сработает.Как вы можете видеть из журналов, это сообщение processed_already никогда не появляется, что означает, что триггер не извлекает новые данные, в следующий раз, когда он запускается.

У меня нет идей, пожалуйста, сообщите.

РЕДАКТИРОВАТЬ: Вот моя функция: https://pastebin.com/PRA7CbxL

enter image description here

1 Ответ

0 голосов
/ 21 февраля 2019

Мне удалось выяснить это с помощью могущественного @Doug и упомянутых подобных вопросов.

В конце концов, проблема с моим кодом заключалась в том, что, когда я отмечал свою транзакцию как processed, Я предполагал, что во второй / третий раз, когда функция сработает, snapshot.data() будет значением документа (мне потребовалось некоторое время, чтобы понять), что на самом деле это были change данные, отправленные к триггеру базы данных.Я знаю, это звучит странно, но функция не отправляет значение документа (для этого вы можете получить snapshot.ref и извлечь данные оттуда, чтобы получить обновленное значение в транзакции).

Итак, вот моя обновленная функция на Pastebin .Вот скриншот кода в действии: https://i.imgur.com/fbQSGT6.png

...