reactjs Firestore一直尝试在Next.js应用程序中运行时设置模拟器

j2qf4p5b  于 2023-02-03  发布在  React
关注(0)|答案(3)|浏览(97)

有没有人在firebase和它的模拟器上遇到过麻烦?我在热重载时一直收到下面的错误。

Firebase错误:Firestore已经启动,其设置不能再更改。您只能在调用Firestore对象上的任何其他方法之前修改设置。

初始化:

// Initialize Firebase
const firebaseApp = initializeApp(firebaseConfig);

let mode = "emulate";

const auth = getAuth(firebaseApp);
const db = getFirestore(firebaseApp);
const storage = getStorage(firebaseApp);
const functions = getFunctions(firebaseApp);

if (mode === "emulate") {
  connectAuthEmulator(auth, "http://localhost:9099");
  connectFirestoreEmulator(db, "localhost", 8080);
  connectStorageEmulator(storage, "localhost", 9199);
  connectFunctionsEmulator(functions, "localhost", 5001);
}

export { firebaseApp, db, auth, storage, functions };
q3qa4bjr

q3qa4bjr1#

我将在这里添加this post的解决方案,因为它对我有效。

溶液

const EMULATORS_STARTED = 'EMULATORS_STARTED';
    function startEmulators() {
      if (!global[EMULATORS_STARTED]) {
        global[EMULATORS_STARTED] = true;
        firebase.firestore().useEmulator('localhost', <your_port>);
        firebase.auth().useEmulator('http://localhost:<your_port>/');
      }
    }
    
    if (process.env.NODE_ENV === 'development') {
      startEmulators();
    }
  • 注 *-如果您使用的是Firebase V9:
const EMULATORS_STARTED = 'EMULATORS_STARTED';
function startEmulators() {
  if (!global[EMULATORS_STARTED]) {
    global[EMULATORS_STARTED] = true;
    connectFunctionsEmulator(functions, 'localhost', <your_port>);

    connectFirestoreEmulator(db, 'localhost', <your_port>);
  }
}

if (process.env.NODE_ENV === 'development') {
  startEmulators();
}

原因:

这样做的原因是NextJS试图多次运行到模拟器的连接,这样可以防止模拟器多次连接。

vqlkdk9b

vqlkdk9b2#

看起来useEmulator从同一个浏览器示例被多次调用。我的建议是检查这个post中有类似的问题。

jm81lzqq

jm81lzqq3#

有一个类似的问题,下面做的伎俩给我.

import { getApps } from 'firebase/app';

if (getApps().length === 0) {
   connectAuthEmulator(auth, "http://localhost:9099");
   connectFirestoreEmulator(db, "localhost", 8080);
   connectStorageEmulator(storage, "localhost", 9199);
   connectFunctionsEmulator(functions, "localhost", 5001);  
}

相关问题