正如您在屏幕截图中看到的那样,我无法在 /user_events/{uid}/{eventId} 中更新 /upvoters/。/events/{uid} 是从客户端更新的,它可以工作。当我尝试 console.log 调试我的云功能代码时,我意识到 events.data.val() 返回的不是更新的而是以前的值 /upvoters/ ,但它接收“评级”的当前值。以下是我的客户端和云代码。
编辑: vote() 更新events/{eventId}
和云函数将相同的值复制到/user_events/{uid}/{eventId}
. 我不明白 vote() 是如何无用的。我想要做的是更新user_events
当我events{eventId}
用 vote() 更新它并且它确实更新除了/upvoters/
. 所以基本上发生的事情是;当 vote() 第一次执行/events/upvoters/
是用 vote() 创建的,exports.set_user_events
将整个事件设置为/user_events/{eventId}/upvoters/
运行良好。当 vote() 第二次运行时,我删除了 upvoters 地图中的 upvoter,events/{eventId}/
然后更新了我的云功能,我已经使用 console.log 命令对其进行了调试,并且看到此时event.data.val()
返回就好像没有删除 upvoters但其他值(例如评级)是更新值。所以user_events/{uid}/{eventId}/
更新除了它的支持者孩子。
云代码:
// Add an event to user_events
exports.set_user_events = functions.database.ref('social/events/{pushId}')
.onWrite((event) => {
const original = event.data.val();
console.log('testValue',original);
return admin.database().ref('social/user_events/' + original.owner.uid + "/" + event.params.pushId).set(original);
});
安卓代码:
void vote(String eventId) {
final DatabaseReference eventRef = rootRef.child("events").child(eventId);
eventRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Event e = mutableData.getValue(Event.class);
if (e == null) {
return Transaction.success(mutableData);
}
if(e.upvoters!=null) {
if(!e.upvoters.containsKey(currentUser.getUid())) {
e.upvoters.put(currentUser.getUid(),true);
e. rating = e.rating + 1;
}
else {
e.upvoters.remove(currentUser.getUid());
e.rating = e.rating - 1;
}
}
else {
Map<String,Boolean> upvoters = new HashMap<>();
upvoters.put(currentUser.getUid(),true);
e.rating = e.rating + 1;
e.upvoters = upvoters;
}
mutableData.setValue(e);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
}
});
}