【问题标题】:Firebase onDisconnect not deleting user name on disconnectionFirebase onDisconnect 在断开连接时不删除用户名
【发布时间】:2019-11-15 11:18:25
【问题描述】:

也许我误用了 onDisonnect(),但我查看了 firebase.blog 上的示例代码并且正在尽我所能。

当用户提交用户名时,我调用下面的代码,将用户名添加到 firebase 数据库。然后在断开连接时,我希望从数据库中删除用户名。这意味着数据库将只显示当时连接到应用程序的用户。

我这样做是为了调用数据,然后通过数组映射以显示当前登录的用户。

我曾两次尝试删除该名称,您可以在下面的 con.onDisconnect().remove(); 下的代码中看到,这两种方法都没有按我需要的方式工作。也就是说,如果我从同一台计算机再次登录,第一个用户名将替换第二个用户名!

这是我的代码

setName = e => {
    e.preventDefault()

    let name = this.state.name;
    let connectedRef = firebase.database().ref('.info/connected');
    connectedRef.on('value', function (snap) {
      if (snap.val() === true) {
        // Connected
        let con = myConnectionsRef.push();
        myConnectionsRef.set({
          name
        })
        // On disconnect 
        con.onDisconnect().remove();

        myConnectionsRef.orderByChild('name').equalTo(name).once('child_added', function (snapshot) {
          snapshot.ref.remove();

        // var nameRef = firebase.database().ref('users/'+name);
        // nameRef.remove()
        })
      }
    });

我哪里错了?有没有更好的方法来使用 onDisconnect?从 fb 论坛上的示例中,不清楚我将把该代码块放在哪里,因此我为什么要尝试这样做。

谢谢。

【问题讨论】:

    标签: reactjs firebase firebase-realtime-database


    【解决方案1】:

    如果我正确理解你的目标是什么,你不需要

    myConnectionsRef.orderByChild('name').equalTo(name).once('child_added', function (snapshot) {
      snapshot.ref.remove();
    
    // var nameRef = firebase.database().ref('users/'+name);
    // nameRef.remove()
    }) 
    

    onDisconnect().remove() 电话会解决这个问题。

    此外,正如您所指的博客 article 中所述(以及在 doc 中显示的):

    onDisconnect() 调用应之前调用set() 本身。这是为了 避免将用户的存在设置为 true 的竞争条件,并且 客户端在onDisconnect() 操作发生之前断开连接 效果,留下一个幽灵用户。


    所以下面的代码应该可以解决问题:

    setName = e => {
        e.preventDefault()
    
        let name = this.state.name;
    
        const connectedRef = firebase.database().ref('.info/connected');
    
        const usersRef = firebase.database().ref('users');
    
        connectedRef.on('value', function (snap) {
          if (snap.val() === true) {
            // Connected
            const con = usersRef.child(name);  //Here we define a Reference
    
            // When I disconnect, remove the data at the Database location corresponding to the Reference defined above 
            con.onDisconnect().remove();
    
           // Add this name to the list of users
            con.set(true);   //Here we write data (true) to the Database location corresponding to the Reference defined above 
          }
        });
    

    用户节点会按名称显示已连接用户列表,如下:

    - users
       - James: true
       - Renaud: true
    

    【讨论】:

    • 好的,太好了!我已经接近了,但你刚刚搞定了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多