FireStore与Firebase Auth配置冲突:重复应用实例错误解决方案咨询
Firebase初始化重复应用错误解决方案
问题描述
发现FireStore的messagingSenderId与Firebase Auth的messagingSenderId不同,于是拆分为两个配置进行初始化,却遇到错误:FirebaseError: Firebase: Firebase App named '[DEFAULT]' already exists with different options or config (app/duplicate-app)
相关代码:
// Import the functions you need from the SDKs you need import { initializeApp, getApps, getApp } from "firebase/app"; import { getAuth } from "firebase/auth"; import { getFireStore } from "@firebase/firestore"; // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries // Your web app's Firebase configuration const firebaseConfig = { apiKey: "someKey", authDomain: "someDomain", projectId: "same ID", storageBucket: "same storage bucket", messagingSenderId: "Different messagingSenderId", appId: "same ID", }; const fireStoreConfig = { apiKey: "sameKey", authDomain: "sameDomain", projectId: "same ID", storageBucket: "same storage bucket", messagingSenderId: "Different messagingSenderId", appId: "same ID", }; // Initialize Firebase let app = {}; getApps().length === 0 ? (app = initializeApp(firebaseConfig)) : (app = getApp()); storeApp = initializeApp(fireStoreConfig); export const auth = getAuth(app); export const db = getFireStore(storeApp);
请问是否应该分开配置,或是有更优的解决方式?
解决方案
1. 核心结论:完全不需要分开配置
messagingSenderId是Firebase Cloud Messaging(FCM)的专属配置,和Firebase Auth、FireStore的核心功能没有关联。同一个Firebase项目下,Auth和FireStore共享同一套应用配置即可,messagingSenderId的差异大概率是配置复制时的失误,或是FCM配置更新导致,但不会影响Auth和FireStore的正常运行。
2. 修正后的代码
只需初始化一次默认Firebase应用,分别获取Auth和FireStore实例:
import { initializeApp, getApps, getApp } from "firebase/app"; import { getAuth } from "firebase/auth"; import { getFireStore } from "@firebase/firestore"; // 使用统一的项目配置 const firebaseConfig = { apiKey: "someKey", authDomain: "someDomain", projectId: "same ID", storageBucket: "same storage bucket", // 任选一个messagingSenderId即可,或使用项目最新的FCM配置 messagingSenderId: "your-project-messaging-sender-id", appId: "same ID", }; // 初始化默认应用(避免重复初始化) const app = getApps().length === 0 ? initializeApp(firebaseConfig) : getApp(); // 从同一应用实例获取Auth和FireStore export const auth = getAuth(app); export const db = getFireStore(app);
3. 若确实需要多应用初始化(特殊场景)
如果你的需求是连接不同Firebase项目的Auth和FireStore,才需要初始化多个应用,此时必须给第二个应用指定唯一名称:
// 初始化默认应用(用于Auth) const authApp = getApps().length === 0 ? initializeApp(firebaseConfig) : getApp(); // 初始化第二个应用(指定名称"firestore-app") const storeApp = initializeApp(fireStoreConfig, "firestore-app"); export const auth = getAuth(authApp); export const db = getFireStore(storeApp);
但这种场景在你的问题中完全没必要,属于过度设计。
内容的提问来源于stack exchange,提问作者Mustafa Walid
相关产品推荐
相关产品推荐

