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

Firestore getDocs()函数无响应:Promise未完成/拒绝问题求助

解决Firestore getDocs() Promise挂起无响应问题

问题分析

你的代码中getDocs()调用卡住,无返回也无报错,但addDoc()正常工作,大概率是安全规则权限限制或代码写法不规范导致,以下是具体排查和修复方案:

修复步骤

1. 修正useEffect的async回调写法

useEffect的回调函数不能直接是async函数(会返回Promise,与useEffect期望的清理函数/undefined冲突),虽然这不是直接导致挂起的原因,但会影响错误捕获和后续逻辑,改为内部定义async函数:

useEffect(() => {
  const fetchBooks = async () => {
    console.log('1')
    try {
      const allDocs = await firebaseService.getAllDocuments('books');
      setBooks(allDocs);
      console.log('2')
    } catch (err) {
      console.error('获取书籍失败:', err); // 新增错误捕获,排查报错
    }
  };
  fetchBooks();
}, []);

2. 检查Firestore安全规则

如果你的规则要求用户认证后才能读取数据,但App挂载时用户未登录,Firebase SDK会一直等待认证状态变化,导致getDocs()的Promise永久挂起。

临时修改规则测试(仅用于排查,上线前需改回安全规则):

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /books/{book} {
      allow read, write: if true; // 临时开放读写权限
    }
  }
}

如果修改后能正常获取数据,说明是权限问题,你可以:

  • 调整规则为允许公开读取(根据业务需求)
  • 在获取数据前确保用户已完成登录
  • 使用匿名认证自动为未登录用户分配临时身份

3. 调整getAllDocuments返回格式

当前你返回的是QuerySnapshot对象,组件中需要的是文档数据数组,修改方法:

async getAllDocuments(collectionName) {
    try {
        const q = query(collection(this.firestore, collectionName));
        console.log('1');
        const querySnapshot = await getDocs(q);
        console.log('2');
        // 转换为包含文档ID的数据数组
        const docsList = querySnapshot.docs.map(doc => ({
            id: doc.id,
            ...doc.data()
        }));
        return docsList;
    } catch (error) {
        console.error('Error getting documents:', error.message);
        throw error;
    }
}

4. 确保Firebase仅初始化一次

避免重复初始化Firebase App,修改构造函数:

constructor() {
    try {
        // 如果已初始化则复用,否则初始化
        this.firebaseApp = getApp();
    } catch (e) {
        this.firebaseApp = initializeApp(firebaseConfig);
    }
    this.auth = getAuth(this.firebaseApp);
    this.firestore = getFirestore(this.firebaseApp);
}

5. 排查网络请求

打开浏览器开发者工具→Network标签,过滤firestore.googleapis.com的请求,查看请求状态:

  • 如果是pending状态:检查网络环境是否屏蔽了Firebase服务
  • 如果有403/其他错误:根据错误信息调整规则或代码

内容的提问来源于stack exchange,提问作者Jun Wen Soh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:22:49