Firebase транзакция возвращает ноль и завершается без ошибок - PullRequest
0 голосов
/ 02 мая 2018

У меня есть простая транзакция, которая должна вернуть счетчик дочернего узла, хранящийся в моей базе данных в реальном времени, и увеличить его. Возможно, стоит отметить, что эта транзакция находится внутри функции 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);
});

1 Ответ

0 голосов
/ 02 мая 2018

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

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

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

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

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

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

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