Firebase 事务 returns 为 null 并无错误地完成

Firebase transaction returns null and completes without error

我有一个简单的事务,它应该 return 存储在我的实时数据库中的子节点的计数并增加它。可能值得注意的是,此事务位于 firebase 云 onWrite 函数内。

问题是数据 returned 为空。我知道当客户端数据陈旧时这是可能的但是函数退出时没有错误并且提交是错误的。

当我使用完全相同的引用检索数据快照时,正确的值为 returned。

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);
});

您可以预料到事务处理程序的第一次调用会给您一个空值。这在 documentation:

中说明

Transaction Function is Called Multiple Times

Your transaction handler is called multiple times and must be able to handle null data. Even if there is existing data in your database it may not be locally cached when the transaction function is run.

问题是您的函数在值为 null 的情况下 return 没有值。这向事务发出您要中止事务的信号。根据 transaction() 的 API 文档:

The function should return the new value it would like written (as a JavaScript object). If undefined is returned (i.e. you return with no arguments) the transaction will be aborted and the data at this location will not be modified.

我之前链接的文档中的示例代码始终执行增量 returns 一个值:

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