La base de données Firebase 3.3 en temps réel est collée à "faire une tentative de connexion" avec React Native 0.32

firebase@3.3.0

réagir indigènes v0.32 testé sur appareil android avec wifi

la base de données Firebase n'a pas de règles d'auth, elle est ouverte en lecture et écriture.

étant donné la structure de fichier suivante:

|_ firebase.js
|_ actions.js

Cela ne fonctionne pas :

firebase.js

import firebase from 'firebase'

const config = {
    apiKey: "*****",
    authDomain: "****",
    databaseURL: "*****",
    storageBucket: "*****",
}

firebase.database.enableLogging(true);

export default firebase.initializeApp(config)

actions.js

import firebase from './firebase'

export const fetchData = () => {
    const Data = firebase.database().ref('some/data')
    Data.on('value', (snapshot) => {
        console.log("snapshot", snapshot.val())  // never printed
    }, (error) => {
        console.error(error)
    })
}

sortie de débogage

p:0: Browser went online.  
firebase-database.js:36 p:0: Listen called for /some/data default  
firebase-database.js:36 p:0: Making a connection attempt

Rien d'autre...


Ceci fonctionne (mais ce n'est pas une solution) :

firebase.js

...same content as above...

export default () => firebase.initializeApp(config)  // we export a function instead to trigger the initialization when the app is ready

actions.js

...same content as above...
const Data = firebase().database().ref('some/data') // we "manually" trigger the initialization, it's obviously not a good solution since we can't initialize the app multiple times

sortie

p:0: Browser went online.  
firebase-database.js:36 p:0: Listen called for /some/data default  
firebase-database.js:36 p:0: Making a connection attempt  
firebase-database.js:36 p:0: Auth token refreshed  
firebase-database.js:36 getToken() completed. Creating connection. 
firebase-database.js:36 c:0:0: Connection created  

Ce que je fais mal ? J'ai aussi remarqué qu'une fois que j' import firebase from 'firebase', le firebase la variable est disponible globalement dans tous les fichiers qui ne sont pas le firebase var de l'instruction d'importation (j'aurais pu écrire import FooBar from 'firebase', le firebase global var est toujours importée)

19
demandé sur Pcriulan 2016-08-25 22:01:20

1 réponses

puisque personne ne semble avoir de réponse "officielle". Voici la solution que j'ai trouvée pour fournir une sorte d'initialisation paresseuse:

firebase.js

import Firebase from 'firebase'

let _database = null

const initFirebase = () => {
    var config = {
        apiKey: "*************",
        authDomain: "************",
        databaseURL: "**********",
        storageBucket: "************",
    }

    Firebase.database.enableLogging(true)
    Firebase.initializeApp(config)
}

export const getDatabase = () => {
    if (!_database) {
        initFirebase()
        _database = Firebase.database()
    }
    return _database
}

alors, n'importe où vous avez besoin de la database:

import { getDatabase } from './firebase'

const methodThatNeedDatabase = () => {
    getDatabase().ref('/some/ref')
    ...
}
2
répondu Pcriulan 2016-09-20 10:33:23