Firebase函数:无法读取未定义

时间:2017-10-20 11:05:24

标签: javascript firebase-realtime-database google-cloud-functions

我正在尝试在我的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()功能?有什么想法吗?

1 个答案:

答案 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}`)
    });
});