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

时间:2016-05-20 02:36:33

标签: 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();
  

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

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

    // 2nd file - don't initialize
    var rootRef = firebase.database().ref();
  

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

在我刚刚调用的新API之前

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

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

5 个答案:

答案 0 :(得分:43)

这是我遇到的问题,以及升级到新版本的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

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

import FBApp from '/your/module/location'
var messagesRef = FBApp.ref("messages/");

答案 1 :(得分:26)

您需要为不同的实例命名(应用为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);

您可以在“添加Firebase”的更新Initialize multiple apps部分中找到更多示例方案,并将其添加到JavaScript项目指南中。

答案 2 :(得分:3)

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

aside {
  height: 80%;
  width: 15%;
  background-color: #0ee;
  opacity: 0.25;
  outline: 2px #0bb solid;
  position: absolute;
  top: 50%;
  left: 85%;
  transform: translate( -50%, -50% );
}

Firebase会尝试获取应用程序,如果它不存在,那么您可以自由地初始化它。

答案 3 :(得分:2)

我通过这样的导入犯了错误。

import firebase from 'firebase'

const firebaseConfig = {
  apiKey: 'key',
  authDomain: 'domain',
  databaseURL: 'url',
  storageBucket: ''
};

firebase.initializeApp(firebaseConfig);

这几天工作正常,但当我尝试使用custom tokens登录时,我的身份验证对象未被更改。我不得不刷新页面以便更新,所以我可以对数据库进行某些调用,这些调用受我自己的身份验证凭据规则的保护。

 ".read": "$uid === auth.uid || auth.isAdmin === true || auth.isTeacher === true",

当我将导入更改为此时,它再次起作用。

import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/database';

const firebaseConfig = {
  apiKey: 'key',
  authDomain: 'domain',
  databaseURL: 'url',
  storageBucket: ''
};

firebase.initializeApp(firebaseConfig);

然后每当我需要在某个模块中使用Firebase时,我会导入它(注意从firebase / app而不是firebase导入):

import firebase from 'firebase/app';

与某些服务交谈:

firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    // Authenticated.
  } else {
    // Logged out.
  }
});

firebase.database().ref('myref').once('value').then((snapshot) => {
  // do stuff with the snapshot
});

答案 4 :(得分:1)

要使用new firebase.initializeApp()创建多个实例,需要firebase构造函数的第二个参数:

firebase.initializeApp( {}, "second parameter" );

将其与生成多个实例

的旧方法进行比较
new Firebase.Context() 

是第二个参数:

new Firebase('', new Firebase.Context() );