Firebase транзакция возвращает ноль и завершается без ошибок

1

У меня есть простая транзакция, которая должна возвращать счет дочернего узла, хранящегося в моей базе данных в реальном времени, и увеличивать его. Возможно, стоит отметить, что эта транзакция находится внутри облака firebase onWrite.

Проблема в том, что возвращаемые данные равны нулю. Я знаю, что это возможно, когда данные клиента устарели, однако функция выходит без ошибок и совершена ложно.

Когда я использую ту же самую ссылку для получения моментального снимка данных, возвращается правильное значение.

var ref = admin.database(devDB).ref('/path/to/countValue');
ref.transaction(function(count) {
  if(count != null) {
     var newCount = count + 1;
     return newCount;
  }
 }, function(error, committed, ss) {
     if(error) {
        console.log('error: ', error);
     }
     console.log('committed: ', committed);
});
Теги:
firebase
google-cloud-functions
firebase-admin
firebase-realtime-database

1 ответ

2
Лучший ответ

Вы можете ожидать, что первый вызов обработчика транзакции даст вам нулевое значение. Это указано в документации:

Функция транзакции вызывается несколько раз

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

Проблема в том, что ваша функция не возвращает значение в случае, когда значение равно null. Это сигнализирует о транзакции, которую вы хотите прервать транзакцию. Согласно документам API для транзакции():

Функция должна вернуть новое значение, которое оно хочет записать (как объект JavaScript). Если undefined возвращается (т.е. вы возвращаетесь без аргументов), транзакция будет прервана, и данные в этом месте не будут изменены.

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

upvotesRef.transaction(function (current_value) {
  return (current_value || 0) + 1;
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню