【问题标题】:Firebase Functions: Cannot read property 'val' of undefinedFirebase 函数:无法读取未定义的属性“val”
【发布时间】:2018-04-01 13:11:20
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-10-30
      • 2018-09-19
      • 2018-12-05
      • 2019-12-23
      • 2020-03-26
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多