【发布时间】:2018-11-04 09:45:51
【问题描述】:
您好,以上是我在 firebase 实时数据库中的简单数据结构。我正在开发一个简单的云函数,它将侦听用户节点“score”属性中的更新并更新位于层次结构较高的“averageScore”字段。
这是我的 onWrite 回调:
.onWrite((change, context) => {
if (!change.before.exists() || !change.after.exists()) {
return null;
}
const beforeScore = parseFloat(change.before.val()['score']);
const afterScore = parseFloat(change.after.val()['score']);
const userRef = change.after.ref;
var promises = [
userRef.parent.parent.child('userCount').once('value'),
userRef.parent.parent.child('averageScore').once('value')
];
return userRef.transaction(() => {
return Promise.all(promises).then((snapshots) => {
const userCount = snapshots[0].val();
const averageScore = snapshots[1].val();
const currentAverage = (( ( averageScore * userCount ) - beforeScore + afterScore ) / userCount ).toFixed(2);
return userRef.parent.parent.child('averageScore').set(currentAverage);
});
});
});
如果我更新 userId 1234 的 score,则 averageScore 字段会根据此代码正确更新。但是,在此更新之后,整个用户 ID 节点 1234 将被DELETED。这是一个相当令人头疼的问题,并希望从社区中获得一些关于我可能做错了什么的见解。
干杯。
【问题讨论】:
-
我认为您误解了事务如何与实时数据库一起工作。这里有很多问题(包括在事务中使用
set(),以及到达事务本身的位置之外。 -
@DougStevenson 是的,我的误解完全正确。想通了并发布了答案。谢谢。
标签: firebase firebase-realtime-database google-cloud-functions