modules from example auth app javascript firebase

javascript - from - firebase version



Inicializa referencias de Firebase en dos archivos separados en la nueva API (5)

Cometí el error al importar de esta manera.

import firebase from ''firebase'' const firebaseConfig = { apiKey: ''key'', authDomain: ''domain'', databaseURL: ''url'', storageBucket: '''' }; firebase.initializeApp(firebaseConfig);

Esto funcionó bien durante unos días, pero cuando traté de iniciar sesión con tokens personalizados, mi objeto de autenticación no se modificó. Tuve que actualizar la página para que se actualizara y poder realizar ciertas llamadas a la base de datos que estaban protegidas por mis propias reglas de credenciales de autenticación.

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

Cuando cambié mis importaciones a esto, funcionó de nuevo.

import firebase from ''firebase/app''; import ''firebase/auth''; import ''firebase/database''; const firebaseConfig = { apiKey: ''key'', authDomain: ''domain'', databaseURL: ''url'', storageBucket: '''' }; firebase.initializeApp(firebaseConfig);

Luego, cuando necesito usar Firebase en un determinado módulo, lo importo (fíjese en la importación desde firebase / app en lugar de desde Firebase):

import firebase from ''firebase/app'';

Y hable con ciertos servicios como estos:

firebase.auth().onAuthStateChanged((user) => { if (user) { // Authenticated. } else { // Logged out. } }); firebase.database().ref(''myref'').once(''value'').then((snapshot) => { // do stuff with the snapshot });

Me actualicé a la nueva API y no sé cómo inicializar las referencias de Firebase en dos archivos separados:

/* 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();

RESULTADO: bundle.js: 535 Error no detectado: la aplicación Firebase denominada ''[DEFAULT]'' ya existe.

/* CASE 2 */ // 1st file var config = {/* ... */}; firebase.initializeApp(config); var rootRef = firebase.database().ref(); // 2nd file - don''t initialize var rootRef = firebase.database().ref();

RESULTADO: bundle.js: 529 Error no detectado: no se ha creado ninguna aplicación de Firebase [DEFAULT] - llame a Firebase App.initializeApp ().

Antes de la nueva API acabo de llamar

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

en cada archivo, y funcionó bien.


Debes nombrar tus diferentes instancias (aplicaciones como Firebase las llama); de forma predeterminada, está trabajando con la aplicación [DEFAULT] , porque ese es el caso de uso más común, pero cuando necesita trabajar con varias aplicaciones, debe agregar un nombre al inicializar:

// 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);

Puede encontrar más escenarios de ejemplo en la sección actualizada Inicializar múltiples aplicaciones de Agregar Firebase a su guía de proyectos de JavaScript.


Este es un problema que encontré al actualizar a la nueva versión de Firebase. Es posible que desee dos aplicaciones separadas de Firebase inicializadas, como se explica en otras respuestas, pero solo quería utilizar las referencias en dos ubicaciones diferentes en mi aplicación y estaba obteniendo el mismo error.

Lo que debe hacer en esta situación es crear un módulo de base de datos para su aplicación que solo inicialice Firebase una vez y luego importarlo o requerirlo en otro lugar de su aplicación.

Esto es bastante simple, aquí está el mío: 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

Y luego, en otra parte de tu solicitud, simplemente:

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


Para hacer varias instancias usando new firebase.initializeApp() , necesita un segundo parámetro para el constructor de firebase:

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

Compárelo con la forma anterior de generar múltiples instancias donde

new Firebase.Context()

es el segundo parámetro:

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


Si no tienes el control sobre dónde se creará una instancia de Firebase, puedes hacer algo como esto:

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

Firebase intentará obtener la aplicación, si no existe, entonces podrás inicializarla libremente.