修改澄清:我有两个问题。 1.为什么我的节点被覆盖了? 2.为什么回调显然被称为recursivly?
我按照this guide为我的网络应用程序实现状态系统。我希望所有登录用户始终能够知道所有其他用户是否在线。 这是我的代码:
currentGameRef = gamesInProgressRef.child(newState.currentTable);
var myConnectionsRef = currentGameRef.child("player" + newState.myPlayerNumber).child("connections");
var lastOnlineRef = currentGameRef.child("player" + newState.myPlayerNumber).child("lastOnline");
var connectedRef = firebase.database().ref('.info/connected');
connectedRef.on("value", function(snap) {
if(snap.val() == true){
var con = myConnectionsRef.push(true);
con.onDisconnect().remove();
lastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP);
}
});
当我测试代码时,它会向每个玩家“连接” - 节点写入数千个true
。奇怪的是,每个玩家的所有其他孩子都被删除了。为什么会这样?
播放器节点如下所示:
"player1" : {
"name": "Vladimir Putin",
"country": "Russia",
...,
...,
"connections" : {
...
...
}
}
我没有在我的代码中设置“player1”-node,只是它的一个孩子。我知道100%的上述代码导致了这种行为,但我无法弄清楚原因。有人可以告诉我为什么上面的代码会清除播放器节点吗?
答案 0 :(得分:0)
似乎newState附带的变量出了问题。我在这里做了这个测试:
// Initialize Firebase
var config = {
apiKey: '<your-api-key>',
authDomain: '<your-auth-domain>',
databaseURL: '<your-database-url>',
storageBucket: '<your-storage-bucket>'
};
firebase.initializeApp(config);
// fixed values just for test
var newState = {
myPlayerNumber: 1,
currentTable: 2
};
var gamesInProgressRef = firebase.database().ref('games');
currentGameRef = gamesInProgressRef.child(newState.currentTable);
var myConnectionsRef = currentGameRef.child("player" + newState.myPlayerNumber).child("connections");
var lastOnlineRef = currentGameRef.child("player" + newState.myPlayerNumber).child("lastOnline");
var connectedRef = firebase.database().ref('.info/connected');
connectedRef.on("value", function(snap) {
if(snap.val() == true){
var con = myConnectionsRef.push(true);
con.onDisconnect().remove();
lastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP);
}
});
我发生了以下情况。
1)第一个连接客户端
2)连接第二个客户
3)两个客户端都已断开连接
在我看来,这是理想的结果。因此,尝试调试正在使用的新状态,也许你正在获得未定义的&#39;或其他一些固定价值。