【问题标题】:Firebase transaction() returning with blank item before providing populated item [duplicate]Firebase transaction() 在提供填充项目之前返回空白项目[重复]
【发布时间】:2023-02-03 23:36:54
【问题描述】:

我在我的实时数据库中使用事务如下:

admin.database().ref(`/users/${uid}`).transaction((user) => {
  if (user) {
    console.log("user exists");
    // ... modify the user ...
    admin.database().ref(`/notifications/${user.guid}`).transaction((notification) => {
      // modify notification object
    }
    return user;
  } else {
    console.log("user did not exist");
    return { /* information about a new user */ };
  }
});

结果很奇怪。我看到两个 console.logs,如下所示:

> user did not exist
> user exists

即使用户对象存在。最终发生的是我创建了一个用户,覆盖了旧用户。

我已经尝试删除事务中的嵌套通知事务,然后它似乎可以工作,但我仍然首先得到相同的> user did not existconsole.log()输出,但不清楚为什么会这样。

我想这里有两个问题。首先是不存在的代码路径执行的原因,其次是如果不是这样,我应该如何将我从事务的读取部分检索到的值传递给另一个写入。

谢谢!

【问题讨论】:

    标签: node.js firebase firebase-realtime-database transactions nested-transactions


    【解决方案1】:

    正如doc中解释的,Transaction函数被多次调用

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

    这就是为什么控制台先写没有用户,再写有用户的原因。

    请注意,您不应在事务中调用事务。

    【讨论】: