Firestore调用getDocs查询集合报Expected type 'mc'错误如何解决
错误原因
该类型错误的核心触发原因是错误地将异步API当作同步方法调用:
Firebase v9+ 模块化SDK中,getDocs()是基于Promise实现的异步方法,不会同步返回查询快照对象。当前代码中没有等待Promise解析完成,就直接对返回的Promise实例调用forEach,传入的参数类型和SDK预期的QuerySnapshot类型不匹配,就会抛出这个类型校验错误。报错信息里的mc、ln是SDK代码打包压缩后的内部类名,没有额外业务含义。
修复方案
- 必须等待
getDocs()的异步执行结果返回后,再遍历查询到的文档。在ReactuseEffect钩子中处理异步逻辑,推荐在内部定义异步函数调用,避免直接给useEffect回调加async导致的返回值不符合钩子预期的问题。 - 补充异常捕获逻辑,方便定位权限、网络类的请求错误。
修复后的可运行代码:
useEffect(() => { const loadPosts = async () => { try { // 无过滤/排序等查询条件时,可直接传入集合引用,无需额外套query包装 const postsCol = collection(db, "posts"); const querySnapshot = await getDocs(postsCol); querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); } catch (err) { console.error("获取posts集合数据失败:", err); } }; loadPosts(); // 可在此处返回清理函数,处理组件卸载时的请求中断逻辑,避免内存泄漏 }, []);
也可以选择Promise链式调用的写法实现,效果一致:
useEffect(() => { const postsCol = collection(db, "posts"); getDocs(postsCol) .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); }) .catch((err) => { console.error("获取posts集合数据失败:", err); }); }, []);
补充说明:如果没有排序、过滤、分页这类查询条件,不需要额外调用
query()包装集合引用,直接将collection()返回的集合引用传入getDocs()即可,这行冗余写法不会触发报错,但可以简化代码。
内容的提问来源于stack exchange,提问作者himanshuTomar
相关产品推荐
相关产品推荐

