Firebase运行报错db.collection is not a function,该如何排查解决?
错误原因
该错误由两个核心问题共同导致:
- 你导出的
db并非Firestore数据库实例,而是Firebase Cloud Storage存储服务的实例。你的初始化代码调用getStorage()获取了存储服务,后续却用它操作Firestore集合,两类服务能力完全不匹配,Storage实例自然不存在collection方法。 - 你使用的是Firebase v9及以上的模块化版本API,但是写数据库操作时用的是v8及之前的旧版命名空间式写法(
db.collection().add()),新版API已经不再支持该调用方式。
修复步骤
- 首先修改Firebase初始化代码,引入Firestore服务,导出正确的Firestore实例,Storage可单独导出备用:
import { initializeApp, getApps } from 'firebase/app'; import { getStorage } from 'firebase/storage'; // 新增引入Firestore服务 import { getFirestore } from 'firebase/firestore'; const firebaseConfig = { apiKey: 'key', authDomain: 'facebook-clone-nextjs-2dcc9.firebaseapp.com', projectId: 'facebook-clone-nextjs-2dcc9', storageBucket: 'facebook-clone-nextjs-2dcc9.appspot.com', messagingSenderId: '662489031143', appId: '1:662489031143:web:ae71393e61a214e3f35d42', measurementId: 'G-VFB246J0M5', }; const firebaseApp = initializeApp(firebaseConfig); // 导出Firestore实例作为db const db = getFirestore(firebaseApp); // Storage单独导出用于后续文件上传等需求 const storage = getStorage(firebaseApp); export { db, storage };
- 然后修改发帖的
sendpost逻辑,改为符合v9+模块化API的写法:
首先在对应文件头部引入需要的Firestore方法:
import { collection, addDoc, serverTimestamp } from 'firebase/firestore'; import { db } from '替换为你自己的firebase初始化文件路径';
再替换原有sendpost代码:
const sendpost = (e) => { e.preventDefault(); if (!inputRef.current.value) return; addDoc(collection(db, 'post'), { message: inputRef.current.value, name: session.user.name, email: session.user.email, image: session.user.image, timestamp: serverTimestamp(), }); inputRef.current.value = ''; };
内容的提问来源于stack exchange,提问作者shams tabraiz Baig
相关产品推荐
相关产品推荐

