【问题标题】:Firebase transaction reads null at path even when there is data at that path即使该路径上有数据,Firebase 事务也会在路径上读取 null
【发布时间】:2021-04-01 12:12:18
【问题描述】:

我了解 firebase 事务有时会将数据读取为 null,但随后循环再次运行,直到从服务器获取并提交该值。但是,我面临一种独特的情况,即事务读取空数据并提交我在为空的情况下返回的值。请查看随附的代码。

 deductTransaction.transaction((current_value) => {
       if (current_value != null) {
           return current_value - cost;
       }
       return 25;
   });

在上面的代码中,“deductTransaction”是我要更新的数据(数字)的路径

上面的代码在某些情况下运行良好,即循环再次运行以防读取 null,有时它只运行一次,即使该路径上有一些数据,也会将值读取为 null 然后提交 25 从而破坏原始数据

P.S:我的头发快要拔掉了,所以非常感谢任何帮助

【问题讨论】:

  • 根据标签,您似乎在云函数中使用此事务。能否添加 Cloud Function 的整个代码?

标签: javascript node.js firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

当您在某个位置运行事务时,会立即调用回调/处理程序,并使用客户端当前对该位置的值的猜测。大多数情况下,当前值的初始猜测是null

您的处理程序需要处理这种情况。所以:假设该位置不存在数据并且您想扣除成本,会发生什么?通常,您要么返回-25,要么告诉交易中止。

无论哪种方式:初始猜测和新值将被发送到数据库服务器,然后数据库服务器检测到初始猜测错误,并将当前值返回给调用者。然后 SDK 再次调用您的处理程序/回调,对当前值进行(希望是正确的)最佳猜测。

另见:


注意:现在您可以使用increment 运算符在没有事务的情况下执行递增和递减操作。这将大大简化您的代码,并且性能更好,如 How quickly can you atomically increment a value on the Firebase Realtime Database? 所示。

为了比较:如果该位置不存在值,increment 运算符假定当前值为 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2011-03-11
    • 2014-08-04
    • 1970-01-01
    • 2013-09-20
    • 2015-01-26
    相关资源
    最近更新 更多