【发布时间】:2022-01-14 18:53:26
【问题描述】:
我有一个如下所示的 Firestore 数据库:
一个集合用于车辆,一个用于组织,一个用于用户。在组织集合中,每个文档都有一个名为车辆的字段,其中包含该公司拥有的车辆集合中的车辆。 users 集合中的每个文档都有一个名为车辆的字段,其中包含该用户有权访问的所有车辆。在我的应用程序中,我可以删除整个组织(删除 orgs 集合中的文档)。然后我有负责其余部分的云功能。或者至少应该。
exports.deleteVehiclesInOrg = functions.firestore.document("/orgs/{orgId}").onDelete((snap) => {
const deletedOrgVehicles = snap.data().vehicles;
return deleteVehiclesInOrg(deletedOrgVehicles);
});
const deleteVehiclesInOrg = async(deletedVehicles: string[]) => {
for (const vehicle of deletedVehicles) {
await admin.firestore().doc(vehicles/${vehicle}).delete();
}
return null;
};
当车辆集合中的文档被删除时,上面的这个触发函数会从这个组织中删除所有触发这个函数的车辆:
const getIndexOfVehicleInUser = (vehicle: string,user: FirebaseFirestore.DocumentData) => {
for (let i = 0; i < user.vehicles.length; i++) {
if (user.vehicles[i].vehicleId === vehicle) {
return I;
}
}return null;
};
const deleteVehiclefromUsers = async (uids: [{ userId: string }],vehicleId: string) => {
for (const user of uids) {
const userSnap = await admin.firestore().doc(`users/${user.userId}`).get();
const userDoc = userSnap.data();
if (userDoc) {
const index = getIndexOfVehicleInUser(vehicleId,userDoc);
userDoc.vehicles.splice(index, 1);
await admin.firestore().doc(`users/${user.userId}`).update({ vehicles: userDoc.vehicles });
}
}
return null;
};
exports.deleteVehicleFromUsers = functions.firestore.document("/vehicles/{vehicleId}").onDelete((snap, context) => {
const deletedVehicleId = context.params.vehicleId;
const deletedVehicleUsers = snap.data().users;
return deleteVehiclefromUsers(deletedVehicleUsers, deletedVehicleId);});
deleteVehiclesInOrg 函数应该触发,firebase 函数总是删除 orgs 文档中的所有车辆。这应该会触发 deleteVehicleFromUsers 函数,该函数会从用户文档中删除车辆。我的问题是有时会,有时不会。大多数时候,如果我有大约 10 辆车,它只会删除大约 6-8 辆车。但每次所有车辆都按应有的方式拆除。
当另一个函数 (deleteVehiclesInOrg) 删除了应该触发函数 deleteVehicleFromUsers 的文档时,是否有一个我没有正确处理的承诺,或者不可能依赖这样的后台触发函数?
【问题讨论】:
-
嗨@Andreas,如果可能的话,请您在发生间歇性删除时提供日志。谢谢。
-
下面的答案解决了这个问题,谢谢@MarcAnthonyB
标签: node.js firebase google-cloud-firestore google-cloud-functions