如何使用Google Cloud Function查询现有的子对象并在对象上循环以检测它是否存在于Firebase中?

egdjgwm8  于 11个月前  发布在  Go
关注(0)|答案(1)|浏览(118)

我正在尝试更新(添加)firebase数据库上的一些子节点。在这种情况下,我需要使用更新对象更新一个节点,而不使用Google Cloud Function替换所有子节点。
这个问题源于这里的一个:如何使用更新对象更新一个节点,而不使用Google Cloud Function覆盖所有子节点?
我的数据结构是这样的:

root: { 
  doors: {
    111111111111: {
       MACaddress: "111111111111",
       inRoom: "-LBMH_8KHf_N9CvLqhzU", // I will need this value for the clone's path
       ins: {
          // I am creating several "key: pair"s here, something like:
          1525104151100: true,
          1525104151183: true,
       }
    },
    222222222222: {
       MACaddress: "222222222222",
       inRoom: "-LBMH_8KHf_N9CvLqhzU", // I will need this value for the clone's path
       ins: {
          // I am creating several "key: pair"s here, something like:
          2525104157710: true,
          2525104157711: true,
       }
    }
  },
  rooms: {
    -LBMH_8KHf_N9CvLqhzU: {
      ins: {
        // I want the function to clone the same data here:
        1525104151100: true,
        1525104151183: true,
      }
    }
  }

字符串
我试图查询现有的“ins”,并在对象上循环,以检测它是否存在,然后再添加它们,这样我就可以为键添加一个后缀,以防它们已经存在。这是我的功能。

exports.updateBuildingsOuts = functions.database.ref('/doors/{MACaddress}').onWrite((change, context) => {
    const afterData = change.after.val(); // data after the write

    const roomPushKey = afterData.inRoom;
    const ins = afterData.ins;

    const updates = {};
    // forEach loop to update the keys individually
    Object.keys(ins).forEach(key => {
            parentPath =  ['/rooms/' + roomPushKey + '/ins/']; // defining the path where I want to check if the data exists
            // querying the "ins"
            admin.database().ref().parentPath.on('value', function(snapshot) {
                if (snapshot.hasChild(key)) {
                    updates['/rooms/' + roomPushKey + '/ins/' + key + "_a"] = true; // define 'updates' Object adding a suffix "_a"

                    return admin.database().ref().update(updates); // do the update adding the suffix "_a"

                } else {
                    updates['/rooms/' + roomPushKey + '/ins/' + key] = true; // define update Object without suffix

                    return admin.database().ref().update(updates); // do the 'updates' without suffix
                }
              });
        });


此云函数正在检索错误:
TypeError:无法读取Object.keys.forEach.key中未定义的属性“on”
我肯定我过于复杂,但我还没有能够找到一个更清晰的逻辑。
你有什么关于如何精简的建议吗?可能吗?

b4lqfgs4

b4lqfgs41#

您可以执行以下操作:

let afterIns;
exports.updateRoom = functions.database.ref('/doors/{MACaddress}').onWrite((change, context) => {

    const beforeData = change.before.val();  //data before
    const insBefore = beforeData.ins;

    const afterData = change.after.val(); // data after the write
    const roomPushKey = afterData.inRoom;
    afterIns = afterData.ins;

    return admin.database().ref().update(updates);

    const updates = {};

    Object.keys(ins).forEach(key => {
        if (insBefore.hasOwnProperty(key)) { // checking if the insBefore object has a key equal to value 'key'
            //True -> add an extra character at the existing key
            updates['/rooms/' + roomPushKey + '/ins/' + key + '_a'] = true;  //<- _a being the extra character
        } else {
            updates['/rooms/' + roomPushKey + '/ins/' + key] = true;
        }
    });

    return admin.database().ref().update(updates);

}).catch(error => {
    console.log(error);
    //+ other error treatment if necessary

});

字符串
不要忘记函数返回change.before.val();之前的数据(除了之后的数据),因此您不必执行admin.database().ref().parentPath.on('value', function(snapshot) {
评论后编辑
这应该可以工作,但我还没有测试它。你可能需要测试insBefore是未定义的,除了测试它是null。我让你微调它。

let insAfter;
let roomPushKey ;
exports.updateRoomIns = functions.database.ref('/doors/{MACaddress}').onWrite((change, context) => {
    const afterData = change.after.val(); // data after the write
    roomPushKey = afterData.inRoom;
    insAfter = afterData.ins;
    return admin.database().ref('/rooms/' + roomPushKey).once('value').then(snapshot => {
    const insBefore = snapshot.val().ins;
    const updates = {};
    if (insBefore === null || insBefore === undefined ) {
        Object.keys(insAfter).forEach(key => {
           updates['/rooms/' + roomPushKey + '/ins/' + key] = true;
        });
    } else {
        Object.keys(insAfter).forEach(key => {
           if (insBefore.hasOwnProperty(key)) {
              updates['/rooms/' + roomPushKey + '/ins/' + key + '_a'] = true; 
           } else {
              updates['/rooms/' + roomPushKey + '/ins/' + key] = true;
           }
        });
    }
    return admin.database().ref().update(updates);
    });
});.catch(error => {
    console.log(error);
    //+ other error treatment if necessary

});

相关问题