使用Firebase 9版本Firestore提交存储数据时出现报错
问题原因
- 未执行Firebase初始化逻辑:你封装的
FirebaseUtil中定义了initFirebase()初始化方法,但实际业务代码执行前没有调用该方法,导致Firebase App实例未创建。 getFirestore()未传入App实例:Firebase 9模块化API要求获取Firestore实例时必须传入已初始化的App实例,你当前的fireStore()方法直接无参调用getFirestore(),得到的实例未关联你的项目。- 项目ID配置错误:你当前配置里直接把
projectId写死为12345,和Firebase控制台的实际项目ID不匹配,无法正确连接到你的Firestore服务。
修复方案
- 调整
FirebaseUtil封装逻辑,自动完成初始化,同时给getFirestore传入正确的App实例:
import { initializeApp, getApp, getApps, FirebaseApp } from 'firebase/app' import { getStorage, FirebaseStorage } from 'firebase/storage' import { getFirestore, Firestore } from 'firebase/firestore' class FirebaseUtil { private app: FirebaseApp | undefined constructor() { // 构造函数自动执行初始化,避免手动调用遗漏 this.initFirebase() } initFirebase(): void { const firebaseConfig = { apiKey: import.meta.env.VITE_FIREBASE_KEY, // 替换为你Firebase控制台对应项目的实际projectId,建议也放进环境变量管理 projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID, authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN, databaseURL: import.meta.env.VITE_FIREBASE_DATABASE, storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET } if (!getApps().length) { this.app = initializeApp(firebaseConfig) } else { this.app = getApp() } } firebaseStorage(): FirebaseStorage { if (!this.app) throw new Error('Firebase 未完成初始化') return getStorage(this.app) } fireStore(): Firestore { if (!this.app) throw new Error('Firebase 未完成初始化') // 传入已初始化的App实例 return getFirestore(this.app) } } export default new FirebaseUtil()
- 检查Firestore安全规则:刚创建的Firebase项目默认禁止Firestore读写,测试阶段可临时放开权限,进入Firebase控制台的Firestore数据库页面,把规则修改为:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if request.time < timestamp.date(2024, 12, 31); } } }
注意该规则仅用于测试,项目上线前必须替换为符合业务逻辑的正式权限控制规则。
3. 确认所有环境变量的配置值和Firebase控制台给出的配置完全一致,没有拼写错误。
4. 确认业务代码顶部已经导入所需的Firestore方法:
import { addDoc, collection } from 'firebase/firestore'
内容的提问来源于stack exchange,提问作者mjubilee1
相关产品推荐
相关产品推荐

