我有一个功能,如果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))
);
});
答案 0 :(得分:0)
问题是firebase尝试在同一位置写入2次,为避免此问题,我实现了事务,后者保证firebase等到之前的写入完成。
UsersRef.child(user).child('credits').transaction(function(currentCredits){
console.log(currentCredits);
return currentCredits + parseInt(bet, 10);
})