【问题标题】:firebase.database is not a functionfirebase.database 不是函数
【发布时间】:2020-10-24 06:53:03
【问题描述】:

我正在尝试从早期的 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;
}

【问题讨论】:

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


    【解决方案1】:

    npm install --save firebase

    然后:

    require("firebase/database");

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        使用

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

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

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

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

            【讨论】:

            【解决方案6】:

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

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

            这将创建一个新的构建,并且错误应该消失了。

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

            【讨论】:

              【解决方案7】:

              我也有同样的错误-firebase.database is not a function-但是不同的情况你只需要添加

              上面还有包含 Firebase 配置的 javascript 链接。

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

                  聚会有点晚了,但如果有人想知道 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: [
                    ]
                  })
                  

                  【讨论】:

                    【解决方案10】:

                    首先,确保你正在使用

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

                    【讨论】:

                    • doc 建议对移动设备使用重定向方法。因此,我可以使用重定向方法使用 facebook 进行身份验证,但这会重新加载我的网页(目前正在 chrome 上测试 ionic 应用程序)并且我无法获取有效负载详细信息。我已经更新了上面的代码
                    猜你喜欢
                    • 1970-01-01
                    • 2022-01-25
                    • 2020-07-17
                    • 2021-08-18
                    • 2017-10-24
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多