首页 > 解决方案 > 如何从另一个节点事件触发的“onWrite”函数中访问 Google Cloud Function 中的特定节点?

问题描述

创建新节点时,我想创建相同的数据并将其推送到不同的节点。

Door/111111111111/ins节点是我将新数据推送到的节点:

root: { 
  doors: {
    111111111111: {
       MACaddress: "111111111111",
       inRoom: "-LBMH_8KHf_N9CvLqhzU",
       ins: {
          // I am creating several "key: pair"s here, something like:
          1525104151100: true,
          1525104151183: true,
       }
    }
  },
  rooms: {
    -LBMH_8KHf_N9CvLqhzU: {
      ins: {
        // I want the function to clone the same data here:
        1525104151100: true,
        1525104151183: true,
      }
    }
  }

这是我抛出错误的函数:

类型错误:change.before.ref.parent.child(...).val 不是函数

代码:

exports.updateRoom = functions.database.ref('/doors/{MACaddress}/ins').onWrite((change, context) => {
    const beforeData = change.before.val(); // data before the write
    console.log(beforeData); // all good so far
    const afterData = change.after.val(); // data after the write
    console.log(afterData); // all good so far

    const roomPushKey = change.before.ref.parent.child('/inRoom').val(); // ERROR
    console.log(roomPushKey);

    return change.after.ref.parent.parent.parent.child('/rooms').child(roomPushKey).child('/ins').set(afterData);
});

我的路径有什么问题?我怎样才能让它更新另一个节点?

标签: javascriptnode.jsfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


child()是Reference上的一个方法,它返回另一个 Reference 对象。Reference 没有 val() 方法,因为它不包含任何数据。这只是一个参考。

要获取数据库触发器位置之外的数据,您需要查询实时数据库。使用once()方法。这是非常常见的,您应该能够使用示例和文档来确定您需要做什么。


推荐阅读