You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase删除文档报错求助(基于Sonny Sangha的Dropbox克隆项目)

Firebase删除文档报错(与fileId相关)的排查与解决

在实现Sonny Sangha的YouTube Dropbox克隆项目时,调用Firebase删除文档时遇到与fileId相关的报错。已从Zustand状态仓库获取fileId传入deleteDoc方法,但问题未解决,相关代码如下:

async function deleteFile() {
  if (!user || !fileId) return;

  // the pat to the file we want to delete. this indicates the location of the file we want to delete
  const fileRef = sRef(storage, `users/${user.id}/files/${fileId}`);
  const docRef = doc(db, "users", user.id, "files", fileId);
  // const docRef = db.doc("users/user.id/files/fileId");

  try {
    deleteObject(fileRef).then(async () => {
      deleteDoc(docRef).then(() => {
        console.log("Delete!");
      });
    });
  } catch (error) {
    console.log(error);
  }
  setIsDeleteModalOpen(false);
}

1. 修复异步错误捕获逻辑

当前代码的try/catch无法捕获deleteObject和deleteDoc内部的Promise错误,链式调用的错误不会冒泡到外层try/catch。改用await语法可确保所有异步错误被捕获,方便查看具体报错信息:

async function deleteFile() {
  // 增强校验:确保fileId是有效字符串
  if (!user || !fileId || typeof fileId !== 'string') {
    console.warn("用户信息或fileId无效");
    setIsDeleteModalOpen(false);
    return;
  }

  const fileRef = sRef(storage, `users/${user.id}/files/${fileId}`);
  const docRef = doc(db, "users", user.id, "files", fileId);

  try {
    await deleteObject(fileRef);
    await deleteDoc(docRef);
    console.log("删除成功!");
  } catch (error) {
    // 打印完整错误信息,定位具体问题
    console.error("删除失败:", error);
    // 可在此处添加用户友好的错误提示
  } finally {
    // 无论成功失败都关闭模态框
    setIsDeleteModalOpen(false);
  }
}

2. 确认fileId的有效性

  • 在deleteFile函数开头添加日志,确认fileId的值是否正确:
    console.log("当前要删除的fileId:", fileId);
    
    检查是否为undefined、空字符串,或者不是目标文件的正确ID。
  • 验证Zustand状态同步:确认点击删除按钮时,已将当前文件的ID正确存入Zustand状态中,避免状态未更新导致使用旧的fileId。

3. 核对Firestore文档路径

确认users/${user.id}/files/${fileId}路径下确实存在对应的文档:

  • 打开Firebase控制台,进入Firestore数据库,手动检查该路径是否有匹配fileId的文档。
  • 排查上传逻辑:确保上传文件时,Firestore文档的ID与Storage文件的ID一致,避免用Storage的ID去删除不存在的Firestore文档。

4. 检查Firestore安全规则

确保Firestore的安全规则允许当前用户删除目标文档。示例规则如下(仅允许文档所有者删除):

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId}/files/{fileId} {
      allow delete: if request.auth != null && request.auth.uid == userId;
    }
  }
}

如果规则限制过严或配置错误,会导致权限不足报错,即使fileId正确也无法删除。

内容的提问来源于stack exchange,提问作者KELzzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:26:30