我已升级到新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/");
在每个文件中,它工作正常。
答案 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() );