javascript - Firebase 函数 : Cannot read property 'val' of undefined

标签 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: Cannot read property 'val' of undefined

我正在遵循 Firebase 函数入门 ( Add the makeUppercase() function ) 中的第一个示例,这就是它为了到达实体引用而执行的操作:

event.data.ref.parent

我是否错误地使用了child()函数?有什么想法吗?

最佳答案

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

关于javascript - Firebase 函数 : Cannot read property 'val' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46847818/

相关文章:

javascript - 相同类别的数字如何相加?

javascript - 多余的花括号

ios - Firebase 在 Swift 3 中处理其中包含字典的子快照

node.js - Firebase 函数 - 无法检索函数源代码

firebase - 为什么云函数 URL (Firebase) 可以公开访问?如何限制访问特定的外部调用?

javascript - Firebase云函数: How to push data using wildcards in http requests

javascript - 在地球下方显示铯停止形状?

javascript - AngularJS 去抖动未按预期工作

javascript - Firebase 的云函数 : Update/Set using admin sdk which returns a promise

java - 每次用户在 Android 中注册时,都会在 firebase 数据库中创建一个新用户条目