代码之家  ›  专栏  ›  技术社区  ›  Padawan

Firebase事务返回null并完成,无错误

  •  4
  • Padawan  · 技术社区  · 7 年前

    我有一个简单的事务,它应该返回存储在实时数据库中的子节点的计数并递增它。值得注意的是,该事务位于firebase cloud onWrite函数内部。

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

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

    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 回复  |  直到 7 年前
        1
  •  4
  •   Doug Stevenson    7 年前

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

    多次调用事务函数

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

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

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

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

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