Firebase不要写

时间:2019-01-23 23:17:13

标签: javascript firebase firebase-realtime-database

我有一个功能,如果15分钟后未播放比赛,则会从用户中删除比赛。如果创建匹配项的用户向匹配项中添加硬币,则该功能将这些硬币检索到用户配置文件中。 这是代码

function deleteMatch(key,user,bet){

  MatchesRef.child(key).remove();
  UsersRef.child(user).once('value').then(userSnapshot => {
    const credits = userSnapshot.val().credits || 0;
    return UsersRef.child(user).child('credits').set(credits + parseInt(bet, 10));
  })
}

问题是,如果该函数在同一分钟内接收到创建2个匹配项的用户的参数,则仅添加1个硬币。 用户1有9个硬币,用户2有8个硬币。

示例参数:match1(key1,user1,1),match2(key2,user2,1)

使用此参数,代码可以工作,现在user1有10个硬币,user2有9个硬币。

但参数不同

用户1有9个硬币,用户2有8个硬币。

示例参数出现问题: match1(key1,user1,1),match2(key2,user2,1)match3(key3,user1,1)。

使用此代码可以读取所有匹配项,但是在代码之后,用户1有10个硬币,用户2有9个硬币。

该代码没有给出2个硬币,user1创建的每个匹配都分配1个硬币。

我认为这是因为firebase试图一次写入用户节点2次。但是不知道如何解决

开始执行操作的代码

module.exports = () =>
  MatchesRef.once('value').then(snap => {
    const now = new Date().getTime();
    const records = [];
    snap.forEach(row => {
      const { date, hour, adversary1, bet } = row.val();
      console.log("el adversario es "+ adversary1);
      if (!date || !hour) return;
      const [day, month] = date.split('/').map(p => parseInt(p, 10));
      const [h, min] = hour.split(':').map(p => parseInt(p, 10));
      const scheduledTime = (new Date((new Date()).getFullYear(), month - 1, day, h, min, 0, 0))
          .getTime() + expireMinutes * 60 * 1000;
      if (scheduledTime <= now) {

          records.push({ key: row.key, user: adversary1, bet });

          deleteMatch(row.key,adversary1,bet);
        //records.map(({key,user,bet}) => deleteMatch({key,user, bet}))
      }
    });
    return Promise.all(
     // records.map(({key, user, bet}) => expireMatch(key, user, bet))
    );
  });

1 个答案:

答案 0 :(得分:0)

问题是firebase尝试在同一位置写入2次,为避免此问题,我实现了事务,后者保证firebase等到之前的写入完成。

UsersRef.child(user).child('credits').transaction(function(currentCredits){
         console.log(currentCredits);
          return currentCredits + parseInt(bet, 10);
        })