Firebase事务返回null并完成且没有错误

时间:2018-05-01 22:15:51

标签: javascript firebase firebase-realtime-database google-cloud-functions firebase-admin

我有一个简单的事务,它应该返回存储在我的实时数据库中的子节点的计数并递增它。值得注意的是,此事务位于firebase cloud 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 :(得分:3)

您可以预期事务处理程序的第一次调用将为您提供空值。这在documentation

中说明
  

多次调用交易功能

     

您的事务处理程序被多次调用,并且必须能够处理空数据。即使数据库中存在现有数据,也可能在运行事务功能时不会本地缓存。

问题是,在值为null的情况下,函数不会返回值。这向您要中止事务的事务发出信号。根据{{​​3}}的API文档:

  

该函数应该返回它想要写的新值(作为JavaScript对象)。如果返回undefined(即,您返回时没有参数),则将中止事务,并且不会修改此位置的数据。

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

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