首页 > 解决方案 > 删除/onDisconnect 在注销时不起作用

问题描述

使用文档,我创建了以下存在函数:

     function setPresence() {
      var myConnectionsRef = firebase.database().ref('users/' + currentUser.uid + '/connections');
      var connectedRef = firebase.database().ref('.info/connected');
      connectedRef.on('value', function(snap) {
        if (snap.val() === true) {
          var con = myConnectionsRef.push();
          con.onDisconnect().remove();
          con.set("profile");
        }
      });
    }

我有基本的退出功能

firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});

问题是 onDisconnect 在注销时似乎没有激活。我需要在他们注销时清除用户状态,但由于某种原因,我收到权限被拒绝错误:

使用this,当身份验证状态更改以致用户未定义时,我尝试了以下操作:

      firebase.database().ref('users/' + currentUser.uid ).remove()
        .then(function() {
          console.log("Remove succeeded.");
          window.location = "/";
        })
        .catch(function(error) {
          console.log("Remove failed: " + error.message)
        });

我正在使用基本的安全规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "auth != null",
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}

知道我做错了什么吗?

标签: javascriptfirebase-realtime-databasefirebase-authentication

解决方案


从身份验证中注销用户与连接到实时数据库无关。虽然您的安全规则可能要求用户登录,但在产品级别没有这样的要求:许多应用程序允许未经身份验证的用户使用其部分数据。

.info/connected侦听器是客户true端可以连接到 Firebase 实时数据库服务器的时间,与他们是否可以访问该数据库中的特定数据无关。

您为连接定义的任何onDisconnect处理程序都会在(服务器检测到)连接丢失时执行。这又与用户的登录状态无关。

如果您想在用户退出时将其标记为不再存在,您应该在退出之前删除他们的状态节点。因此,您firebase.database().ref('users/' + currentUser.uid ).remove()需要调用firebase.auth().signOut().

firebase.database().ref('users/' + currentUser.uid ).remove().then(() => {
  firebase.auth().signOut().then(() => {
    window.location = "/";
  });
})

推荐阅读