firebase.database不是一个函数

时间:2016-07-07 14:54:47

标签: javascript angularjs ionic-framework firebase firebase-realtime-database

我正在尝试从早期的firebase版本升级到ionic project中的最新版本。我按照this教程进行了升级。在此页面的第4步中,我停留在最后一条语句firebase.database().ref();上。

错误消息

TypeError: firebase.database is not a function

以下是我的代码。请帮助。

...

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

更新

添加最新的数据库库后,问题就解决了。

在此处更新我的代码

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;
}

10 个答案:

答案 0 :(得分:24)

我使用Ionic遇到了这个问题,结果发现我在使用最新的Firebase客户端时没有包含所有内容。如果您将Firebase包含为SEd,那么需要单独使用数据库和身份验证文件,因为在以这种方式包含Firebase时它们不会捆绑在一起。

在您加入firebase-app

后,将以下内容添加到index.html
firebase-app.js

显然你不需要使用CDN,你可以使用bower(可能是Ionic的首选方式)或NPM使用Browserify。

<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>

以下摘自Firebase Web Setup Docs

  

只需添加所需功能,即可减少应用使用的代码量。可单独安装的组件是:

     

firebase-app - 核心firebase客户端(必填)   firebase-auth - Firebase身份验证(可选)。
  firebase-database - Firebase实时数据库(可选)。
  firebase-storage - Firebase存储(可选)。

     

从CDN中,包括您需要的各个组件(首先包括firebase-app)

答案 1 :(得分:1)

聚会晚了一点,但是如果有人想知道angular的语法(或Ionic 4),只需将其添加到您的.module.ts文件中(请注意,如peterb所述,/ database导入)

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

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

答案 2 :(得分:0)

在@ angular / firebase 5.1.2上也遇到了这个问题,在更新@ angular / cli和所有依赖项到最新版本时得到解决。

答案 3 :(得分:0)

我有相同的错误 -firebase.database不是函数- ,但是由于不同的情况,您只需要添加

上面以及包含Firebase配置的javascript链接。

您还可以尝试在脚本中使用 defer 属性,因为在加载页面元素之前,该属性不会加载脚本。

答案 4 :(得分:0)

对于在React-native中遇到类似错误(this._database.native.on不是函数)的人-

  1. 运行pod安装-添加Firebase新服务(数据库/身份验证...)
  2. 终止Metro捆绑器,然后使用“ npx react-native start”重新启动
  3. 运行“ npx react-native run-ios”

这将创建一个新的版本,错误应该消失了。

参考:Easier way to print in bold a string variable in matplotlib

答案 5 :(得分:0)

我通过在构造函数中提供url解决了这个问题 firebase.database('https://123.firebaseio.com')

答案 6 :(得分:0)

npm install --save firebase

那么:

require("firebase/database");

您需要通过 require() 添加您正在使用的所有 Firebase 产品,如上所示。

答案 7 :(得分:-1)

首先,确保您正在使用

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

Firebase authWithOAuthPopup在新版本中发生了一些变化。

现在您不使用ref来调用身份验证方法。您应该使用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
});

答案 8 :(得分:-1)

使用

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

答案 9 :(得分:-1)

您需要导入最新版本的 firebase-database 。你可以在cndjs上找到