Firebase v9.8.4中deleteDoc无法删除数据库文档求助
问题分析与解决办法
核心问题:文档ID不匹配
你用addDoc添加文档时,Firebase会自动生成随机的文档ID,而你在文档字段里存的postId: UID只是自定义字段,并非实际的文档ID。但删除时你把post.postId当作文档ID传入doc(db, "Posts", post.postId),相当于去删除Posts/[UID]路径下的文档,可实际文档存在Posts/[Firebase自动生成的ID]路径下,自然无法匹配删除。
另外,你的handleDelete函数里的deleteDoc没有加await,异步操作未等待完成,也可能导致删除逻辑未正确执行。
两种解决思路
思路1:添加文档时使用自定义文档ID(推荐)
放弃addDoc,改用setDoc直接指定文档ID为UID,让文档ID和你存的postId字段一致:
const sendPost = async (event: any) => { event.preventDefault(); if (loading) return; setLoading(true); // 用setDoc指定文档ID为UID const docRef = await setDoc(doc(db, "Posts", UID), { id: tokenId, postId: UID, username: username, profilePic: uri, bio: bio, likes: 0, text: input, timestamp: serverTimestamp(), }); }
之后你的删除逻辑只需给deleteDoc加上await即可:
const handleDelete = async (e:any) => { e.stopPropagation(); // 加上await等待异步操作完成 await deleteDoc(doc(db, "Posts", post.postId)); console.log(post.postId); }
思路2:根据postId字段查询后删除
如果不想修改添加逻辑,就通过查询找到对应文档再删除:
const handleDelete = async (e:any) => { e.stopPropagation(); // 查询postId字段等于目标值的文档 const querySnapshot = await getDocs(query(collection(db, "Posts"), where("postId", "==", post.postId))); // 遍历查询结果删除文档 for (const doc of querySnapshot.docs) { await deleteDoc(doc.ref); } console.log(post.postId); }
额外检查点
- 确认Firebase规则中确实授予了删除权限,规则示例:
match /Posts/{postId} { allow delete: if request.auth != null; // 根据你的实际权限需求调整 }
- 确认
handleDelete中的post.postId确实是目标文档的postId字段值,而非文档ID。
内容的提问来源于stack exchange,提问作者off2eth
相关产品推荐
相关产品推荐

