如何在删除Firestore用户时同步删除其他集合的对应用户文档
问题原因
你代码里的问题主要出在2处:
- 你用
inspection.empty判断Inspection文档是否存在,这个属性是**集合查询结果(QuerySnapshot)**的属性,单个文档查询返回的DocumentSnapshot没有这个属性,判断单个文档是否存在要调用.exists属性,你原来的判断条件永远为假,所以删除Inspection文档的逻辑从未触发。 delete()是异步方法,你没有加await关键字,程序不会等待删除操作执行完成就直接返回响应,会导致删除逻辑未执行完成就提前结束。
另外补充:Firestore默认删除父文档不会自动删除其下的子集合,如果你需要同步删除assignedToMe子集合内的所有内容,需要额外添加递归删除子集合的逻辑。
修复后代码
router.use("/delete", [auth, admin], async function (req, res, next) { try { const { email } = req.body; const userRef = db.collection("Users").doc(email); const insRef = db.collection("Inspection").doc(email); const user = await userRef.get(); const inspection = await insRef.get(); if (!user.exists) { return res.status(404).send("This user has already been deleted!"); } // 等待用户删除完成 await userRef.delete(); // 用exists判断Inspection文档是否存在 if (inspection.exists) { // 等待Inspection文档删除完成 await insRef.delete(); // 如果需要同步删除assignedToMe子集合,取消注释下面的逻辑 // const assignedCol = insRef.collection('assignedToMe'); // const assignedDocs = await assignedCol.get(); // const batch = db.batch(); // assignedDocs.forEach(doc => batch.delete(doc.ref)); // await batch.commit(); } res.status(200).send("User deleted successfully."); } catch (err) { // 捕获错误避免服务无响应 console.error('删除失败:', err); res.status(500).send("Delete failed, please try again later."); } });
Firestore结构参考


内容的提问来源于stack exchange,提问作者Saadi
相关产品推荐
相关产品推荐

