React NextJS Firebase错误刷新名为“[DEFAULT]”的Firebase应用程序已存在

wrrgggsh  于 2023-06-05  发布在  React
关注(0)|答案(8)|浏览(572)

我启动了一个项目,在多个组件中导入firebase时发生错误。
在这个firebase启动文件中:

import firebase from 'firebase'
const firebaseConfig = {
  apiKey: "fdsfsdfdsf",
  authDomain: "fdsfdsfsdfdsf",
  databaseURL: "sdfdsfdsf",
  projectId: "dsfdsfdsf",
  storageBucket: "dsfdsfdsf",
  messagingSenderId: "dsfdsfsdfdsf"
}

const FbApp = firebase.initializeApp(firebaseConfig)

export default FbApp.auth()

然后在组件中:

import firebase from '../lib/firebaseClient'

使用单个组件工作得很好,但是如果我添加一个新组件:

import firebase from '../lib/firebaseClient'

应用程序失败:

错误代码:Firebase:名为“[DEFAULT]”的Firebase应用程序已存在(app/duplicate-app)。

vm0i2vca

vm0i2vca1#

我也遇到了同样的问题,然后我发现了这个:

if (!firebase.apps.length) {
  firebase.initializeApp({});
}

https://github.com/zeit/next.js/issues/1999

bq8i3lrv

bq8i3lrv2#

解决方案:

import firebase from 'firebase'

try {
  firebase.initializeApp({
    databaseURL: 'dfgdfg'
  })
} catch (err) {
  // we skip the "already exists" message which is
  // not an actual error when we're hot-reloading
  if (!/already exists/.test(err.message)) {
    console.error('Firebase initialization error', err.stack)
  }
}

const auth = firebase.auth()
export default auth
odopli94

odopli943#

我的理解是,这个错误是由于对数据库多次调用initializeApp()。扫描代码,确保只调用initializeApp()一次。对我来说,这包括检查任何可能调用该方法的js文件,并检查html文件中是否有重复的js文件。
我最近在自己的代码中解决了这个错误。我的问题是由于不小心在html文件的头部和主体中链接了调用initializeApp()的javascript文件而引起的。我的解决方法是删除html文件头部的重复javascript标签,这样在正文中就只存在一个。

snvhrwxg

snvhrwxg4#

在服务器端,类似这样的东西应该可以工作

const admin = require('firebase-admin');
const serviceAccount = require('./../../credentials/server');

// Check if firebase already been initialized
if (!admin.apps.length) {
  // Initialize Firestore.
  admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
  });
}
brjng4g3

brjng4g35#

总结所有的好答案。更好的解决方法是将环境变量从.env.local加载到process.env中。

//.env.local
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=

接下来,我们可以像这样在客户端初始化Firebase SDK。

//shared/configs/firebase.js
import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';

const clientCredentials = {
  apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
  authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
  projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
  storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
  messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
  appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
};

if (!firebase.apps.length) {
  firebase.initializeApp(clientCredentials);
}

export default firebase;

最后,将Firebase deps导入到其他文件中。

//pages/index.js
import firebase from '../shared/configs/firebase';
ylamdve6

ylamdve66#

所以我遇到了这个问题,因为一些方面的下一个热重装。我使用了如下代码来确保我不会多次调用initializeApp

export let adminClient;
adminClient = adminClient || admin.initializeApp({...});

这不起作用,因为热重载似乎正在清除adminClient,所以我一直试图调用initializeApp,即使firebase仍然记录了应用程序正在初始化。
为了解决这个问题,我使用了以下代码片段:

const getAppInstance = () => {
    if (admin.apps.length) {
        return admin.apps[0];
    } else {
        return initApp();
    }
}

export const adminClient = getAppInstance();

它可以在新的服务器启动时工作,或者在开发过程中由于代码更改而导致的热重新加载时工作。

jw5wzhpr

jw5wzhpr7#

如果您在Next-JS中使用Firebase管理,您可以尝试以下操作

import { initializeApp, getApp, getApps , App } from 'firebase-admin/app';
import { getFirestore } from 'firebase-admin/firestore';

export const app: App = getApps().length ?  getApp() : initializeApp();
export const firestore = getFirestore(app);

这是typescript实现。你可以把它转换成JS
更新日期:2023年6月1日

nfeuvbwi

nfeuvbwi8#

如果您使用的是新的Modular SDK v9.0.1,那么它可能不支持“firebase”命名空间。
实现,我用

import { initializeApp, getApps } from "firebase/app"
    import { getFirestore } from "firebase/firestore"
    import { getAuth } from "firebase/auth"
    
    
    //App configure
    const firebaseConfig = {
        apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
        authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
        projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
        storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
        messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGGING_SENDER_ID,
        appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
        measurementId: process.env.NEXT_PUBLIC_MEASUREMENT_ID
    };
    
    if (!getApps().length) {
      console.log(`...`)
    }
    
    const app = initializeApp(firebaseConfig)
    const db = getFirestore(app)
    const auth = getAuth(app)
    
    export {db, auth}
    export default app

参考文献:

相关问题