2016-11-18 6 views
0

Iは、ユーザ/(ユーザID)/(トピック)の値を照会することはnullを返す以下のデータを有する:ここFirebaseデータのスナップショットキーが、無.val(返し)

{ 
    "topic" : { 
    "cafe" : { 
     "-KWoHbBXzWlD8aHBjg6Z" : { 
     "count" : 0, 
     "id" : "00qMXXXeYkbCbmjajoe4XZeIPuo1", 
     "text" : "A new message", 
     "time" : "2016-11-17T21:56:26.036Z" 
     }, 
     "-KWpBzT83S_RB3wVwZ2u" : { 
     "count" : 3, 
     "id" : "zTSpSTqyRcaJf0MlYl15gBnvYdj2", 
     "text" : "Hello", 
     "time" : "2016-11-18T02:11:29.818Z" 
     } 
    }, 
    "pomodoro" : { 
     "-KWoJhC9V1mLznt7jGwF" : { 
     "count" : 3, 
     "id" : "00qMXXXeYkbCbmjajoe4XZeIPuo1", 
     "text" : "Tomato! #tomato", 
     "time" : "2016-11-17T22:05:34.933Z" 
     } 
    } 
    }, 
    "user" : { 
    "00qMXXXeYkbCbmjajoe4XZeIPuo1" : { 
     "pomodoro" : "2016-11-18T14:20:32.800Z" 
    }, 
    "zTSpSTqyRcaJf0MlYl15gBnvYdj2" : { 
     "cafe" : "2016-11-18T14:24:32.968Z" 
    } 
    } 
} 

は、関連するコードです。

// inside the constructor 
this.database = firebase.database().ref() 

//relevant function 
databaseListenerOn =() => { 

    // does not work correctly 
    let userPath = `user/${this.props.userID}/${this.state.topic}` 
    this.database.child(userPath).on('value', data => { 
    this.setState({time: data.val()}) 
    console.log(data.key) 
    console.log(data.val()) 
    }) 

    //works correctly 
    let messagePath = `topic/${this.state.topic}` 
    this.database.child(messagePath).on('value', data => { 
    let messages = [] 
    data.forEach(message => { 
     messages.push({ 
     count: message.val().count, 
     id: message.val().id, 
     key: message.key, 
     text: message.val().text, 
     time: message.val().time 
     }) 
    }) 
    this.setState({messages: this.state.messages.cloneWithRows(messages)}) 
    }) 
} 

ログdata.keyは正しく 'カフェ' や 'ポモドーロ' を返します。ただし、data.val()はnullを返し、文字列のタイムスタンプにアクセスできません。

同様のコードを使用すると、他のデータに正常にアクセスできます。data.val()がオブジェクトを返すため、私は何が間違っているのか混乱しています。私はこのサイトとGoogleグループで同様の問題を検討しましたが、私の状況に対する答えは見つかりませんでした。

+0

あなたの質問にJSONツリーの画像が含まれています。 Firebaseデータベースコンソールの[エクスポート]ボタンをクリックすると、実際のJSONをテキストとして置き換えてください。 JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。 –

+0

コードは一目瞭然です。問題を再現する最小のJSBinを設定できますか? –

+0

以前はJSBinを使ったことはありませんが、問題を再現できるかどうかはわかります。今のところJSONをテキストと追加情報を追加しました。 – Akira

答えて

1

問題がFirebaseが私のクエリを実行する前に、ユーザーIDを返すようにするために、私は待っていなかったということであった:

// this.props.userID is undefined  
let userPath = `user/${this.props.userID}/${this.state.topic}` 

解決策は、私がユーザーIDを持っていたら、それを呼び出していることを確実にするためにonAuthStateChangedthis.databaseListenerOn()を呼び出すことでした。

関連する問題