J'ai effectué une mise à niveau vers la nouvelle API et je ne sais pas comment initialiser les références Firebase dans deux fichiers distincts:
/* 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();
RÉSULTAT: bundle.js: 535 Erreur non capturée: l'application Firebase nommée '[DEFAULT]' existe déjà.
/* CASE 2 */
// 1st file
var config = {/* ... */};
firebase.initializeApp(config);
var rootRef = firebase.database().ref();
// 2nd file - don't initialize
var rootRef = firebase.database().ref();
RÉSULTAT: bundle.js: 529 Erreur non capturée: aucune application Firebase '[DEFAULT]' n'a été créée - appelez Firebase App.initializeApp ().
Avant la nouvelle API que je viens d'appeler
var myFirebaseRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/");
dans chaque fichier, et cela a bien fonctionné.
C'est un problème que j'ai rencontré lors de la mise à niveau vers la nouvelle version de Firebase. Vous souhaiterez peut-être initialiser deux applications Firebase distinctes, comme expliqué dans d'autres réponses, mais je souhaitais simplement utiliser les références dans deux emplacements différents de mon application et j'entendais la même erreur.
Ce que vous devez faire dans cette situation est de créer un module Firebase pour votre application qui initialise Firebase une seule fois, puis de l’importer ou de le demander ailleurs dans votre application.
C'est assez simple, voici le mien: 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
Et puis ailleurs dans votre application, vous simplement:
import FBApp from '/your/module/location'
var messagesRef = FBApp.ref("messages/");
Vous devez nommer vos différentes instances (les applications comme les appelle Firebase); par défaut, vous travaillez avec le [DEFAULT]
App, car c’est le cas d’utilisation le plus courant, mais lorsque vous devez utiliser plusieurs applications, vous devez ajouter un nom lors de l’initialisation:
// 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);
Vous trouverez d'autres exemples de scénarios dans la section mise à jour Initialiser plusieurs applications du guide Ajouter une base de feu à votre projet JavaScript.
Si vous n'avez pas le contrôle sur l'endroit où Firebase sera instancié, vous pouvez faire quelque chose comme ceci:
try {
let firApp = firebase.app(applicationName);
return firApp;
} catch (error) {
return firebase.initializeApp({
credential: firebase.credential.cert(firebaseCredentials),
databaseURL: firebaseUrl
}, applicationName);
}
Firebase essaiera d’obtenir l’application, si elle n’existe pas, vous pourrez l’initialiser librement.
J'ai fait l'erreur en important comme ça.
import firebase from 'firebase'
const firebaseConfig = {
apiKey: 'key',
authDomain: 'domain',
databaseURL: 'url',
storageBucket: ''
};
firebase.initializeApp(firebaseConfig);
Cela a bien fonctionné pendant quelques jours, mais lorsque j'ai essayé de me connecter avec jetons personnalisés , mon objet auth n'a pas été modifié. J'ai dû actualiser la page pour la mettre à jour afin de pouvoir effectuer certains appels à la base de données protégés par mes propres règles d'authentification.
".read": "$uid === auth.uid || auth.isAdmin === true || auth.isTeacher === true",
Quand j'ai changé mes importations à cela, cela a encore fonctionné.
import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/database';
const firebaseConfig = {
apiKey: 'key',
authDomain: 'domain',
databaseURL: 'url',
storageBucket: ''
};
firebase.initializeApp(firebaseConfig);
Ensuite, chaque fois que j'ai besoin d'utiliser Firebase dans un certain module, j'importe ceci (notez l'importation depuis firebase/app au lieu de firebase):
import firebase from 'firebase/app';
Et parlez à certains services comme suit:
firebase.auth().onAuthStateChanged((user) => {
if (user) {
// Authenticated.
} else {
// Logged out.
}
});
firebase.database().ref('myref').once('value').then((snapshot) => {
// do stuff with the snapshot
});
Pour créer plusieurs occurrences à l'aide de new firebase.initializeApp()
, vous avez besoin d'un deuxième paramètre pour le constructeur de base de feu:
firebase.initializeApp( {}, "second parameter" );
Comparez-le à l'ancienne façon de générer plusieurs instances où
new Firebase.Context()
est le deuxième paramètre:
new Firebase('', new Firebase.Context() );