Estoy tratando de configurar los emuladores V9 de Firebase con Next.js sin suerte. Siempre recibo este error, 
Mi versión de Firebase es 9.1.1 .
Mi configuración de Firebase se ve así:
import { initializeApp, FirebaseApp } from "firebase/app"; import { initializeApp, FirebaseApp } from "firebase/app"; import firebase from "firebase/compat/app"; import { getAuth, connectAuthEmulator, Auth } from "firebase/auth"; import { getFirestore, connectFirestoreEmulator, Firestore, } from "firebase/firestore"; import { getStorage, connectStorageEmulator, FirebaseStorage, } from "firebase/storage"; import { getDatabase, connectDatabaseEmulator, Database, } from "firebase/database"; let firebaseApp: FirebaseApp; let auth: Auth; let firestore: Firestore; let storage: FirebaseStorage; let db: Database; if (!firebase.apps.length) { firebaseApp = initializeApp(clientCredentials); auth = getAuth(firebaseApp); firestore = getFirestore(firebaseApp); storage = getStorage(firebaseApp); db = getDatabase(firebaseApp); } if (IS_DEV) { connectFirestoreEmulator(firestore, "localhost", 8080); connectAuthEmulator(auth, "http://localhost:9099", { disableWarnings: true }); connectDatabaseEmulator(db, "localhost", 9000); connectStorageEmulator(storage, "localhost", 9199); } export { firebaseApp, auth, firestore, storage, db }Me aseguré de que no haya llamadas de mi objeto firestore. Tan pronto como se inicia Next.js, aparece ese error.
Esto sucede debido a los valores del espacio de nombres global y al tiempo de ejecución de NextJs.
Puedes arreglar esto de la siguiente manera:
const EMULATORS_STARTED = 'EMULATORS_STARTED'; function startEmulators() { if (!global[EMULATORS_STARTED]) { global[EMULATORS_STARTED] = true; connectFunctionsEmulator(functions, 'localhost', 5001); connectFirestoreEmulator(db, 'localhost', 8080); connectAuthEmulator(auth, "http://localhost:9099", { disableWarnings: true }); connectDatabaseEmulator(db, "localhost", 9000); connectStorageEmulator(storage, 'localhost', 9199); } }Firebase agrega un espacio de nombres global de 'EMULATORS_STARTED' una vez que se ha iniciado y NextJs intenta ejecutar ese código varias veces. Este script evitará que intentes conectarte a los emuladores más de una vez.