在 firebase 云函数中,child 是 self-deleting

In firebase cloud function the child is self-deleting

当我在下面的函数中添加交易时,“guncelLig”的child 被自动删除。当我删除第二笔交易时没有问题,它运作良好。

此代码正确运行:

    for (let i = 0; i < users.length; i++) {
      const userID = users[i].id;
      database.ref().child("users").child("profilData").child(userID).child("guncelLig").transaction(function (value) {
        if (value > 1) {
          database.ref().child("users").child("profilData").child(userID).update({
            "lastUpdate": toSwiftDate(),
          });
          return value - 1; 
        }
    
        return value;
      });

}

但是当我将新部分添加到下面的代码中时,“guncelLig”已从 firebase 实时数据库中完全删除:

    for (let i = 0; i < users.length; i++) {
      const userID = users[i].id;

   database.ref().child("users").child("profilData").child(userID).child("guncelLig").transaction(function (value) {
        if (value > 1) {
          database.ref().child("users").child("profilData").child(userID).update({
            "lastUpdate": toSwiftDate(),
          });

          /// NEW CODE ERROR SOURCHE
database.ref().child("users").child("profilData").child(userID).child("EnYukselLig").transaction(function (EnYukselLig) {
            if (EnYukselLig > value - 1) {
              return value - 1;
            }
            return EnYukselLig;
          });

          return value - 1; // arttır
        }
        return value; /// ALWAYS RETURN NULL
      });
    }

我哪里做错了?请帮助我

您应该将代码编写为 async/await。使用 await 您可以等待嵌套事务完成。

for (let i = 0; i < users.length; i++) {
  const userID = users[i].id;
  database
    .ref()
    .child("users")
    .child("profilData")
    .child(userID)
    .child("guncelLig")
    .transaction(async (value) => {
      if (value > 1) {
        await database
          .ref()
          .child("users")
          .child("profilData")
          .child(userID)
          .update({
            lastUpdate: toSwiftDate(),
          });

        /// NEW CODE ERROR SOURCHE
        await database
          .ref()
          .child("users")
          .child("profilData")
          .child(userID)
          .child("EnYukselLig")
          .transaction(function (EnYukselLig) {
            if (EnYukselLig > value - 1) {
              return value - 1;
            }
            return EnYukselLig;
          });

        return value - 1; // arttır
      }
      // No handler if the value is NULL
      return value; /// ALWAYS RETURN NULL
    });
}

如果 value 已经是 null,你也不处理这个案例。

不建议嵌套交易。交易本质上可以 运行 多次,并且不能保证它们会按预期完成,具体取决于同一位置发生的更新量。