У меня есть простая транзакция, которая должна возвращать счет дочернего узла, хранящегося в моей базе данных в реальном времени, и увеличивать его. Возможно, стоит отметить, что эта транзакция находится внутри облака 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);
});
Вы можете ожидать, что первый вызов обработчика транзакции даст вам нулевое значение. Это указано в документации:
Функция транзакции вызывается несколько раз
Обработчик транзакций вызывается несколько раз и должен иметь возможность обрабатывать нулевые данные. Даже если в вашей базе данных есть существующие данные, она не может быть локально кэширована при выполнении функции транзакции.
Проблема в том, что ваша функция не возвращает значение в случае, когда значение равно null. Это сигнализирует о транзакции, которую вы хотите прервать транзакцию. Согласно документам API для транзакции():
Функция должна вернуть новое значение, которое оно хочет записать (как объект JavaScript). Если undefined возвращается (т.е. вы возвращаетесь без аргументов), транзакция будет прервана, и данные в этом месте не будут изменены.
Пример кода в документации, которую я связывал ранее, которая выполняет приращение, всегда возвращает значение:
upvotesRef.transaction(function (current_value) {
return (current_value || 0) + 1;
});