2017-10-20 4 views
0

Firebaseデータベースに関数を追加しようとしています。変更するたびに、2つのプロパティを結合/更新します。Firebase関数:未定義のプロパティ 'val'を読み取ることができません

モデルは、このようなものです:

database/ 
    sessions/ 
    id/ 
     day = "1" 
     room = "A100" 
     day_room = "1_A100" 

そして、これまでのところ、私の機能:

exports.combineOnDayChange = functions.database 
    .ref('/sessions/{sessionId}/day') 
    .onWrite(event => { 
     if (!event.data.exists()) { 
      return; 
     } 

     const day = event.data.val(); 
     const room = event.data.ref.parent.child('room').data.val(); 

     console.log(`Day: ${day}, Room: ${room}`) 

     return event.data.ref.parent.child("day_room").set(`${day}_${room}`) 
    }); 

exports.combineOnRoomChange = functions.database 
    .ref('/sessions/{sessionId}/room') 
    .onWrite(event => { 
     if (!event.data.exists()) { 
      return; 
     } 

     const room = event.data.val(); 
     const day = event.data.ref.parent.child('day').data.val(); 

     console.log(`Day: ${day}, Room: ${room}`) 

     return event.data.ref.parent.child("day_room").set(`${day}_${room}`) 
    }); 

しかし、それは、このエラー投げ:私は非常に最初に以下のよ

TypeError: Cannot read property 'val' of undefined

をfirebase関数Getting Started(Add the makeUppercase() function)の例では、エンティティに到達するためにこれが実行されます参照:

event.data.ref.parent 

私が間違ってchild()機能を使用していますか?何か案は?

答えて

0

クラウド機能がコードをトリガすると、変更をトリガしたデータのスナップショットが渡されます。あなたのコードで

exports.combineOnDayChange = functions.database 
    .ref('/sessions/{sessionId}/day') 

これは/sessions/{sessionId}/dayのデータを持っているevent.dataあなたを意味します。ツリーの上位からのデータは含まれません。

event.data.ref.parentを呼び出すと、データがまだロードされていないデータベース内の場所を示します。あなたは追加のデータをロードする場合は、あなたのコード内で明示的にロードする必要があります:

exports.combineOnDayChange = functions.database 
.ref('/sessions/{sessionId}/day') 
.onWrite(event => { 
    if (!event.data.exists()) { 
     return; 
    } 

    const day = event.data.val(); 
    const roomRef = event.data.ref.parent.child('room'); 
    return roomRef.once("value").then(function(snapshot) { 
     const room = snapshot.val(); 

     console.log(`Day: ${day}, Room: ${room}`) 

     return event.data.ref.parent.child("day_room").set(`${day}_${room}`) 
    }); 
}); 

また、あなたのツリー/sessions/{sessionId}の上位をトリガすることを検討してください。そうすれば、すでに必要なデータがすべてevent.dataにあることを意味します。また、1つの関数しか必要ないことを意味します。

exports.updateSyntheticSessionProperties = functions.database 
.ref('/sessions/{sessionId}') 
.onWrite(event => { 
    if (!event.data.exists()) { 
     return; // the session was deleted 
    } 

    const session = event.data.val(); 
    const day_room = `${session.day}_${session.room}`; 
    if (day_room !== session.day_room) { 
     return event.data.ref.parent.child("day_room").set(`${day}_${room}`) 
    }); 
}); 
関連する問題