Подтвердить что ты не робот

Инициализировать ссылки Firebase в двух отдельных файлах в новом API

Я обновился до нового 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 App с именем '[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/");

в каждом файле, и он работал нормально.

4b9b3361

Ответ 1

Это проблема, с которой я столкнулся, а также обновление до новой версии 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/");

Ответ 2

Вам нужно назвать разные экземпляры (Приложения, как 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);

В обновленном Инициализировать несколько приложений вы можете найти дополнительные сценарии добавления Add Firebase в руководство по проекту JavaScript.

Ответ 3

Если у вас нет контроля над тем, где будет создана Firebase, вы можете сделать что-то вроде этого:

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

Firebase попытается получить приложение, если оно не существует, то вы можете его инициализировать свободно.

Ответ 4

Я допустил ошибку, импортировав ее вот так.

import firebase from 'firebase'

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

firebase.initializeApp(firebaseConfig);

Это работало отлично в течение нескольких дней, но когда я попытался войти с пользовательскими токенами, мой объект auth не был изменен. Мне пришлось обновить страницу для обновления, чтобы я мог выполнять определенные вызовы в базе данных, которые были защищены моими собственными правилами учетных данных.

 ".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
});

Ответ 5

Чтобы создать несколько экземпляров с помощью new firebase.initializeApp(), вам понадобится второй параметр для конструктора firebase:

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

Сравните его со старым способом генерации нескольких экземпляров, где

new Firebase.Context() 

- второй параметр:

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