我正在尝试更新(添加)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”
我肯定我过于复杂,但我还没有能够找到一个更清晰的逻辑。
你有什么关于如何精简的建议吗?可能吗?
1条答案
按热度按时间b4lqfgs41#
您可以执行以下操作:
字符串
不要忘记函数返回
change.before.val();
之前的数据(除了之后的数据),因此您不必执行admin.database().ref().parentPath.on('value', function(snapshot) {
评论后编辑
这应该可以工作,但我还没有测试它。你可能需要测试
insBefore
是未定义的,除了测试它是null。我让你微调它。型