如果对象不存在,我们可以对Firebase数据库进行事务处理吗?

时间:2019-12-06 23:28:52

标签: firebase-realtime-database

我在下面有firebase事务,它将在all对象内的yearstat字段中递增。但是,如果stat甚至不存在,firebase会自动为我创建该对象吗?

根据我的测试,我得到一个错误,提示TypeError: Cannot read property 'all' of null显然表明stat为空。如果是这样,如何使用事务创建对象(如果以前不存在)?

const merchantRef = admin.database().ref("statistics/" + merchantId);
merchantRef.transaction(stat => {
  stat.all = (parseInt(stat.all) || 0) + price;
  stat.year = (parseInt(stat.year) || 0) + price;
  return stat;
});

2 个答案:

答案 0 :(得分:1)

您可以通过检查stat是否为null来检查该位置是否有数据。

const merchantRef = admin.database().ref("statistics/" + merchantId);
merchantRef.transaction(stat => {
  if (!stat) stat = { all: 0, year: 0 };
  stat.all += price;
  stat.year += price;
  return stat;
});

答案 1 :(得分:1)

您可以在不存在的位置进行交易。即使它确实存在,您也应该期望对处理程序函数的第一次调用将为您提供null,并且您将需要返回该位置应该的数据。

根据documentation

  

由于您的更新函数被多次调用,因此它必须能够   处理空数据。即使您的遥控器中已有数据   数据库,事务处理功能时可能未在本地缓存它   运行,则初始值为null。