1

以下のコードは、ウォッチャーをusers/パスに接続し、値が変更されたときにユーザーを記録します。onAuthStateChangedの変更後に再実行されない参照Firebase 3.0.0

firebaseの場合、このusers/ツリーは、現在認証されているユーザーのアクセス許可に応じてゲートされます。

firebase.auth().onAuthStateChanged(function(user) { 
    if (user) { 
    // User is signed in. 
    ... do other stuff 
    } else { 
    // No user is signed in. 
    ... do other stuff 
    } 
}); 

firebase.database().ref('users').on('value', function(snapshot) { 
    // log the users 
    console.log(snapshot.val()) 
}); 

問題は、上記のコールバックのように適切な権限を持つユーザーでログインした後、users/ツリーがログに記録されませんです。

users/オブザーバをコールバック内のonAuthStateChangedに移動する以外の解決策がありますか?それはメモリリークの匂いがする。

+0

firebase.database().ref('users').on('value', function(snapshot) { console.log(snapshot.val()) }, function(error) { console.error(error); }); 

は、この問題を解決するには、ユーザーが認証された後にリスナーを添付する必要があります:あなたもon()にエラーコールバックを渡す場合は、これを簡単に見ることができます下に推測される推測を書いてください。しかし、あなたのセキュリティルールを見ていなくても、それはまったく変わったことではありません。 –

答えて

1

ノードにリスナーを接続すると、Firebaseデータベースは、現在の接続にそのノードから読み取る権限があるかどうかをすぐに評価します。そうでなければ、それはリスナを取り消します。

認証されていない状態から開始するので、リスナーはただちに取り消されます。私は「

firebase.auth().onAuthStateChanged(function(user) { 
    if (user) { 
    firebase.database().ref('users').on('value', function(snapshot) { 
     console.log(snapshot.val()) 
    }, function(error) { 
     console.error(error); 
    }); 
    } else { 
    // No user is signed in. 
    ... do other stuff 
    } 
}); 
+0

ユーザーがログアウトした後、または再接続した後で、これらのリファレンスがクリーンアップされるようにするにはどうすればよいですか? –

+0

あなたはそれを解決しましたか?私はアプリでたくさんのリスナーを持っていて、そのすべてのリスナーをキャンセルしたいと思っています。 –

関連する問題