【问题标题】:Firebase transaction returns null and completes without errorFirebase 事务返回 null 并完成且没有错误
【发布时间】:2018-10-11 23:18:49
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您可以期望事务处理程序的第一次调用会给您一个空值。这在documentation 中有说明:

    事务函数被多次调用

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

    问题是你的函数在值为空的情况下不返回值。这向事务发出信号,表明您要中止事务。根据transaction() 的 API 文档:

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

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

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

    【讨论】:

    • 嘿道格!我是否需要在所有写在 ref 上的“setter”中进行交易,或者只在有条件的那个上进行交易?我有一个函数总是写它的绝对值,而另一个函数只有在它等于特定值时才应该替换该值。我只需要第二个交易吗?
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2011-01-28
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多