firebase.database is not a function

JavascriptAngularjsIonic FrameworkFirebaseFirebase Realtime-Database

Javascript Problem Overview


I am trying to upgrade from earlier firebase version to the latest in my ionic project. I followed this tutorial for upgrade. In step 4 from this page I am stuck on the last statement firebase.database().ref();.

Error message

TypeError: firebase.database is not a function

Below is my code. Kindly help.

...

// Initialize Firebase
this.config = {
    apiKey: "some-api-key",
    authDomain: "myapp.firebaseapp.com",
    databaseURL: "https://myapp.firebaseio.com",
    storageBucket: "project-somenumber.appspot.com",
};

...

this.authWithOAuthPopup = function(type) {
    var deferred = $q.defer();
    console.log(service.config);	// ---> Object {apiKey: "some-api-key", authDomain: "myapp.firebaseapp.com", databaseURL: "https://myapp.firebaseio.com", storageBucket: "project-somenumber.appspot.com"}
    firebase.initializeApp(service.config);
    console.log(firebase);	// ---> Object {SDK_VERSION: "3.0.5", INTERNAL: Object}
    service.rootRef = firebase.database().ref(); //new Firebase("https://rsb2.firebaseio.com"); ---> I am getting error on this line "TypeError: firebase.database is not a function"
    service.rootRef.authWithOAuthPopup(type, function(error, authData) {
        if (error) {
            service.authError = error;
            switch (error.code) {
                case "INVALID_EMAIL":
                    console.log("The specified user account email is invalid.");
                    break;
                case "INVALID_PASSWORD":
                    console.log("The specified user account password is incorrect.");
                    break;
                case "INVALID_USER":
                    console.log("The specified user account does not exist.");
                    break;
                default:
                    console.log("Error logging user in:", error);
            }
            deferred.resolve(service.authError);
        } else {
            service.authData = authData;
            console.log("Authenticated successfully with payload:", authData);
            deferred.resolve(service.authData);
        }
        return deferred.promise;
    });
    return deferred.promise;
}

var service = this;

Update

After adding latest database library this questions problem is solved.

Updating my code here

this.authWithOAuthPopup = function(type) {
    var deferred = $q.defer();
    console.log(service.config);
    firebase.initializeApp(service.config);
    console.log(firebase);
    service.rootRef = firebase.database(); //.ref(); //new Firebase("https://rsb2.firebaseio.com");

    var provider = new firebase.auth.FacebookAuthProvider();
    firebase.auth().signInWithRedirect(provider);
    firebase.auth().getRedirectResult().then(function(result) {
        if (result.credential) {
            // This gives you a Facebook Access Token. You can use it to access the Facebook API.
            var token = result.credential.accessToken;
            console.log(result);
            // ...
        }
        // The signed-in user info.
        var user = result.user;
    }).catch(function(error) {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
        // The email of the user's account used.
        var email = error.email;
        // The firebase.auth.AuthCredential type that was used.
        var credential = error.credential;
        // ...
    });
    return deferred.promise;
}

Javascript Solutions


Solution 1 - Javascript

I ran into this with Ionic and it turned out that I wasn't including everything when using the latest Firebase Client. If you've included Firebase as firebase-app, then the Database and Auth pieces need to be required separately since they aren't bundled when including Firebase in this way.

Add the following to your index.html after you include firebase-app.js

<script src="https://www.gstatic.com/firebasejs/3.1.0/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.1.0/firebase-database.js"></script>

Obviously you don't need to use the CDN, you could use bower (probably the preferred way with Ionic) or NPM with Browserify.

// Browserify Setup
var firebase = require('firebase/app');
require('firebase/auth');
require('firebase/database');

Snippet below taken from the Firebase Web Setup Docs

> You can reduce the amount of code your app uses by just including the features you need. The individually installable components are:

>firebase-app - The core firebase client (required).
firebase-auth - Firebase Authentication (optional).
firebase-database - The Firebase Realtime Database (optional).
firebase-storage - Firebase Storage (optional).

>From the CDN, include the individual components you need (include firebase-app first)

Solution 2 - Javascript

A bit late to the party, but in case some one wanted to know the syntax in angular, (or Ionic 4) just add this to your .module.ts file (Note, as peterb mentioned, the /database import)

import { AuthService } from './auth.service';
import { AngularFireAuthModule } from 'angularfire2/auth';
import { AngularFireDatabaseModule } from 'angularfire2/database';

@NgModule({
  imports: [
    AngularFireAuthModule,
    AngularFireDatabaseModule,
    AngularFireModule.initializeApp(environment.firebase),
  ],
  providers: [
  ]
})

Solution 3 - Javascript

i solved this issue by giving the url in the constructor firebase.database('https://123.firebaseio.com';)

Solution 4 - Javascript

First, make sure you are using

<script src="https://www.gstatic.com/firebasejs/3.1.0/firebase.js"></script>

Firebase authWithOAuthPopup has changed a little bit in the new version.

Now you don't use the ref to call authentication methods. You should be using firebase.auth() insted.

var auth = firebase.auth();
var provider = new firebase.auth.TwitterAuthProvider();
auth.signInWithPopup(provider).then(function(result) {
  // User signed in!
  var uid = result.user.uid;
}).catch(function(error) {
  // An error occurred
});

Solution 5 - Javascript

Also faced this problem on @angular/firebase 5.1.2, solved when updated @angular/cli and all dependencies to the latest version.

Solution 6 - Javascript

For people facing similar error(this._database.native.on is not a function) in React-native -

  1. run the pod install - after adding firebase new service(database/auth ...)
  2. terminate the metro bundler and restart it using "npx react-native start"
  3. run "npx react-native run-ios"

This will create a new build and the error should be gone.

Ref: https://github.com/invertase/react-native-firebase/issues/3379

Solution 7 - Javascript

Use

var firebase = require('firebase/app');
require('firebase/database');

Solution 8 - Javascript

You need to import newest version of firebase-database . U can find on cndjs

Solution 9 - Javascript

npm install --save firebase

Then:

require("firebase/database");

You need to add all of the firebase products you are using by way of require() as shown above.

Solution 10 - Javascript

I have the same error -firebase.database is not a function- but with different situation you just need to add

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser801116View Question on Stackoverflow
Solution 1 - JavascriptpetebView Answer on Stackoverflow
Solution 2 - JavascriptRuanView Answer on Stackoverflow
Solution 3 - JavascriptMarcoRView Answer on Stackoverflow
Solution 4 - JavascriptadolfosrsView Answer on Stackoverflow
Solution 5 - JavascriptMaksim KlimenkoView Answer on Stackoverflow
Solution 6 - JavascriptsandyView Answer on Stackoverflow
Solution 7 - JavascriptkvadityaazView Answer on Stackoverflow
Solution 8 - JavascriptYunus FidanView Answer on Stackoverflow
Solution 9 - JavascriptSweet WesternView Answer on Stackoverflow
Solution 10 - JavascriptMahmoud Ahmed FaragallahView Answer on Stackoverflow