Firebase调用.get()获取集合文档报is not a function如何解决
错误原因
这个错误是Firebase JS SDK v9+ 模块化API的调用方式不匹配导致的:
- 你当前使用的是v9之后的模块化导入写法,
collection()返回的集合引用对象本身没有挂载get()实例方法,ref.get()是v8及更早版本全量命名空间API的写法,在模块化版本中,数据读取操作都是独立导出的顶层函数,需要传入引用作为参数调用。 - 你原有代码还有一个隐藏问题:查询快照对象本身不是可遍历的文档数组,直接遍历
snapshot拿不到文档数据,需要访问它的docs属性才能拿到所有文档对象。
修复方法
- 首先补充导入对应模块化API:获取集合下所有文档需要从
firebase/firestore导入getDocs方法。 - 把原有的
userCollectionRef.get()调用替换为getDocs(userCollectionRef),传入集合引用获取快照。 - 遍历快照时,遍历
snapshot.docs属性拿到每个文档实例。 - 建议补充用户ID的非空校验,避免未登录状态下传入非法路径报错。
修复后的完整代码如下:
import { db } from '../firebase' // 补充导入getDocs方法 import { collection, getDocs } from 'firebase/firestore' // 业务逻辑部分 // 提前拦截用户未登录的场景 if (!currentUser?.uid) { console.log('用户未登录,无法获取集合数据') return } const userCollectionRef = collection(db, currentUser.uid) // 调用顶层getDocs方法传入集合引用获取快照 const snapshot = await getDocs(userCollectionRef) // 遍历快照的docs属性获取所有文档 for (const doc of snapshot.docs) { console.log('文档ID:', doc.id) // 如果需要获取文档内的字段数据,调用doc.data()即可 // console.log('文档数据:', doc.data()) }
补充说明:如果想沿用旧版本链式调用的写法,可以切换使用
firebase/firestore/compat的兼容包,但兼容包无法做tree-shaking,会增大打包体积,官方长期推荐使用模块化写法。
内容的提问来源于stack exchange,提问作者Cyberguy Game
相关产品推荐
相关产品推荐

