在新API中的两个单独文件中初始化Firebase引用

Lon*_*han 30 javascript firebase

我已升级到新API,但不知道如何在两个单独的文件中初始化Firebase引用:

    /* CASE 1 */
    // 1st file
    var config = {/* ...  */};
    firebase.initializeApp(config);
    var rootRef = firebase.database().ref();

    // 2nd file - initialize again
    var config = {/* ...  */};
    firebase.initializeApp(config);
    var rootRef = firebase.database().ref();
Run Code Online (Sandbox Code Playgroud)

结果:bundle.js:535未捕获错误:名为"[DEFAULT]"的Firebase应用程序已存在.

    /* CASE 2 */
    // 1st file
    var config = {/* ...  */};
    firebase.initializeApp(config);
    var rootRef = firebase.database().ref();

    // 2nd file - don't initialize
    var rootRef = firebase.database().ref();
Run Code Online (Sandbox Code Playgroud)

结果:bundle.js:529未捕获错误:没有创建Firebase应用程序'[DEFAULT]' - 调用Firebase App.initializeApp().

在我刚刚调用的新API之前

var myFirebaseRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/");
Run Code Online (Sandbox Code Playgroud)

在每个文件中,它工作正常.

lom*_*maj 45

这是我遇到的问题,以及升级到新版本的Firebase.您可能需要初始化两个单独的firebase应用程序,如其他答案中所述,但我只是想在我的应用程序中的两个不同位置使用refs并且我得到了相同的错误.

您需要为此情况做的是为您的应用创建一个firebase模块,该模块仅初始化一次firebase,然后您导入或在应用中的其他地方需要它.

这很简单,这是我的:modules/firebase.js

import firebase from 'firebase';
var firebaseConfig = {
  apiKey: "some-api-key",
  authDomain: "some-app.firebaseapp.com",
  databaseURL: "https://some-app.firebaseio.com",
  storageBucket: "some-app.appspot.com",
};

var FbApp = firebase.initializeApp(firebaseConfig);
module.exports.FBApp = FbApp.database(); //this doesnt have to be database only
Run Code Online (Sandbox Code Playgroud)

然后在您的应用程序的其他地方您只需:

import FBApp from '/your/module/location'
var messagesRef = FBApp.ref("messages/");
Run Code Online (Sandbox Code Playgroud)

  • 这样的导入对我不起作用.我不得不做`const firebase = require("firebase/app"); 要求( "火力/ AUTH"); 要求( "火力/数据库")`.我正在使用firebase v3.0.5.知道什么是错的吗? (2认同)
  • 这个例子是使用ES6模块,如果你在浏览器中构建一个应用程序,你将需要使用像babel这样的东西.使用require也很好,它取决于你希望在你的应用程序中使用哪种类型的模块.我认为长寿的缘故ES6模块可能就是一个例子,如果你觉得有用,我也可以做一个需要的例子,但它非常相似. (2认同)

Jai*_*mez 28

您需要为不同的实例命名(应用为Firebase称之为); 默认情况下,您正在使用[DEFAULT]应用程序,因为这是最常见的用例,但是当您需要使用多个应用程序时,则必须在初始化时添加名称:

// Intialize the "[DEFAULT]" App
var mainApp = firebase.intializeApp({ ... });

// Intialize a "Secondary" App
var secondaryApp = firebase.initializeApp({ ... }, "Secondary");
...
mainApp.database().ref("path/to/data").set(value);
secondaryApp.database().ref("path/to/data").set(anotherValue);
Run Code Online (Sandbox Code Playgroud)

您可以在添加Firebase 的更新初始化多个应用部分中找到更多示例方案,并将其添加到JavaScript项目指南中.

  • 如果您尝试初始化两个不同的firebase应用程序,这是正确的答案,但问题是他试图在两个不同的文件中初始化它,而不是两个不同的应用程序.您不希望两次初始化同一个应用程序,所以我认为上面的答案对于这个特定问题是正确的. (4认同)
  • 这是正确的答案.提供链接的工作. (2认同)
  • 这对我有用.可能是正确的答案. (2认同)

and*_*esk 5

如果您无法控制Firebase的实例化位置,则可以执行以下操作:

 try {
    let firApp = firebase.app(applicationName);
    return firApp;
  } catch (error) {
    return firebase.initializeApp({
      credential: firebase.credential.cert(firebaseCredentials),
      databaseURL: firebaseUrl
    }, applicationName);
  }
Run Code Online (Sandbox Code Playgroud)

Firebase会尝试获取该应用程序,如果该应用程序不存在,则可以自由地对其进行初始化。