我正在尝试在我的Firebase数据库中添加一个功能,无论何时更改,都会创建/更新其他两个人的组合属性。
模型是这样的:
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:无法读取未定义
的属性'val'
我正在关注Firebase函数入门(Add the makeUppercase() function)中的第一个示例,这就是它为了实现实体引用而做的事情:
event.data.ref.parent
我是否错误地使用了child()
功能?有什么想法吗?
答案 0 :(得分:1)
当云功能触发您的代码时,它会传递触发更改的数据的快照。
在您的代码中:
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}`)
});
});