firebase.database 不是函数

新手上路,请多包涵

我正在尝试从早期的 firebase 版本升级到我的 离子项目 中的最新版本。我按照 教程进行了升级。在此页面的第 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;
}

原文由 user801116 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 323
2 个回答

我在使用 Ionic 时遇到了这个问题,结果发现我在使用最新的 Firebase 客户端时并没有包括所有内容。如果您将 Firebase 包含为 firebase-app ,则需要分别需要数据库和 Auth 部分,因为以这种方式包含 Firebase 时它们没有捆绑在一起。

将以下内容添加到您的 index.html 在您包含 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>

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

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

下面的代码片段取自 Firebase Web 设置文档

您可以通过仅包含所需的功能来减少应用程序使用的代码量。可单独安装的组件是:

firebase-app - 核心 firebase 客户端(必需)。

firebase-auth - Firebase 身份验证(可选)。

firebase-database - Firebase 实时数据库(可选)。

firebase-storage - Firebase 存储(可选)。

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

原文由 peteb 发布,翻译遵循 CC BY-SA 4.0 许可协议

派对有点晚了,但如果有人想知道角度语法(或 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: [
  ]
})

原文由 Ruan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题