【发布时间】:2022-12-08 06:44:26
【问题描述】:
几周前我已经更新到 Firebase v9,在尝试将我的 Firebase 应用程序连接到 Firestore 模拟器时遇到问题。
firebase.js(我的 VueJS 插件,我在其中设置 Firebase):
import { initializeApp, getApps } from "firebase/app"
import { getAuth, connectAuthEmulator, onAuthStateChanged } from "firebase/auth";
import { getFirestore, connectFirestoreEmulator } from "firebase/firestore"
import { getStorage, connectStorageEmulator } from "firebase/storage";
import { getFunctions, connectFunctionsEmulator } from 'firebase/functions';
import { isSupported, getAnalytics } from "firebase/analytics";
export default async ({ app }, inject) => {
const firebaseConfig = {
apiKey: process.env.FIREBASE_API_KEY,
authDomain: process.env.FIREBASE_AUTH_DOMAIN,
databaseURL: process.env.FIREBASE_DATABASE_URL,
projectId: process.env.FIREBASE_PROJECT_ID,
storageBucket: process.env.FIREBASE_STORAGE_BUCKET,
messagingSenderId: process.env.FIREBASE_MESSAGING_SERVICE_ID,
appId: process.env.FIREBASE_APP_ID,
measurementId: process.env.FIREBASE_MEASUREMENT_ID,
}
// I've checked, the values of firebaseConfig are all set here.
// This IF statement is here to avoid initializing the app several times
const apps = getApps();
let firebaseApp = null;
if (!apps.length) {
firebaseApp = initializeApp(firebaseConfig);
}
else {
firebaseApp = apps[0];
}
// INIT AUTH
const auth = getAuth();
auth.languageCode = 'fr';
onAuthStateChanged(auth, async authUser => {
const claims = authUser ? (await authUser.getIdTokenResult(true)).claims : null;
await app.store.dispatch('onAuthStateChanged', { authUser, claims });
},
(error) => {
console.error("Firebase Auth onAuthStateChanged ERROR", error)
});
// Get other services
const firestore = getFirestore(firebaseApp);
const storage = getStorage(firebaseApp);
const functions = getFunctions(firebaseApp, process.env.FIREBASE_REGION);
// Setup analytics if supported
let analytics = null;
const analyticsSupported = await isSupported()
if (analyticsSupported) {
analytics = getAnalytics();
analytics.automaticDataCollectionEnabled = false;
}
// Connecting to emulators
if (process.client && process.env.APP_ENV === 'local') {
console.log("LOCAL ENVIRONMENT, CONNECTING TO EMULATORS...");
connectAuthEmulator(auth, "http://localhost:9099");
connectFirestoreEmulator(firestore, 'localhost', 8080);
connectStorageEmulator(storage, "localhost", 9199);
connectFunctionsEmulator(functions, "localhost", 5001);
}
Inject firebase objects into my VueJS app
const fire = { auth, firestore, storage, functions, analytics }
inject('fire', fire);
}
这是我得到的错误,由这一行引起:connectFirestoreEmulator(firestore, 'localhost', 8080);
FirebaseError Firestore 已经启动,其设置可以 不再更改。您只能在调用任何之前修改设置 Firestore 对象上的其他方法。
我不想自己修改 Firestore 对象的
settings属性,所以它必须是方法connectFirestoreEmulator。问题可以缩小到以下代码:
import { initializeApp } from "firebase/app" import { getFirestore, connectFirestoreEmulator } from "firebase/firestore" export default async ({ app }, inject) => { const firebaseConfig = { apiKey: process.env.FIREBASE_API_KEY, authDomain: process.env.FIREBASE_AUTH_DOMAIN, databaseURL: process.env.FIREBASE_DATABASE_URL, projectId: process.env.FIREBASE_PROJECT_ID, storageBucket: process.env.FIREBASE_STORAGE_BUCKET, messagingSenderId: process.env.FIREBASE_MESSAGING_SERVICE_ID, appId: process.env.FIREBASE_APP_ID, measurementId: process.env.FIREBASE_MEASUREMENT_ID, } firebaseApp = initializeApp(firebaseConfig); const firestore = getFirestore(firebaseApp); if (process.env.APP_ENV === 'local') { connectFirestoreEmulator(firestore, 'localhost', 8080); } const fire = { auth, firestore, storage, functions, analytics }; inject('fire', fire); }我设法通过添加
process.client来避免触发错误,因此它不会连接到服务器端 (SSR) 上的模拟器:if (process.client && process.env.APP_ENV === 'local') {但是,当我添加它时,当在第一页加载时在服务器端 (SSR) 执行代码时,模拟器未连接,并且初始 Firestore 数据是从真实的 Firebase 应用程序而不是模拟器读取的。
知道如何管理与 SSR 上的 Firestore 模拟器的正确连接吗?
这是一个 Firebase 错误吗?
我使用的版本:
- 在我的应用程序中:Firebase JS SDK v9.6.9
- 模拟器:用于模拟器的 firebase-tools v10.4.0
我已经阅读/尝试过的内容:
【问题讨论】:
-
嗨 Guillaume,我编辑了 Firebase JS SDK 的答案
-
我在使用 Next.js 和 Firebase 模拟器时偶然发现了同样的问题。将其缩小到导致问题的
connectFirestoreEmulator函数。很确定这是一个错误。您找到解决方法了吗?
标签: firebase vue.js google-cloud-firestore nuxt.js firebase-tools