2017-10-20 107 views
0

我試圖在我的Firebase數據庫中添加一個函數,該函數在更改時創建/更新兩個其他屬性的組合屬性。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函數入門(Add the makeUppercase() function)中的示例,這是它爲了達到實體參考:

event.data.ref.parent 

我是否錯誤地使用child()函數?有任何想法嗎?

回答

0

當Cloud Functions觸發代碼時,會傳入觸發更改的數據的快照。

在您的代碼:

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

這意味着你event.data/sessions/{sessionId}/day數據。它不包含樹中更高的任何數據。

因此,當您撥打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已經,也意味着你只需要一個單一的功能:

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}`) 
    }); 
}); 
相關問題