javascript - Firebase 事务返回 null 并完成且没有错误
问题描述
我有一个简单的事务,它应该返回存储在我的实时数据库中的子节点的计数并增加它。值得注意的是,此事务位于 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);
});
解决方案
您可以期望事务处理程序的第一次调用会给您一个空值。这在文档中有所说明:
事务函数被多次调用
您的事务处理程序被多次调用,并且必须能够处理空数据。即使您的数据库中存在现有数据,在运行事务功能时也可能不会在本地缓存。
问题是您的函数在值为空的情况下不返回值。这向事务发出信号,表明您要中止事务。根据transaction()的 API 文档:
该函数应该返回它想要写入的新值(作为 JavaScript 对象)。如果返回未定义(即您不带参数返回),事务将被中止,并且该位置的数据不会被修改。
我之前链接的文档中执行增量的示例代码始终返回一个值:
upvotesRef.transaction(function (current_value) {
return (current_value || 0) + 1;
});
推荐阅读
- php - WordPress pagination, offset and count users with WP_User_Query()
- tensorflow - After creating an embedding layer using a tensorflow placeholder, how is the tf.nn.embedding_lookup() function used with it?
- for-loop - How to select two table columns in the same for loop
- r - Multi regression of unbalanced data
- objective-c - 如何从用 JSONModel 编写的 NSArray 中删除重复数据?
- spring-boot - Spring boot does not fail for missing @Value property when it comes from custom starter
- ruby-on-rails - 构建 Rails 项目的正确方法
- javascript - data from php script in javascript wrong output
- php - Front-page.php url 蛞蝓
- html - Bootstrap Containers Overlapping With Each Other