Database 不是函数

我试图升级从早期的火基地版本到最新的在我的 离子计划。我按照 这个教程进行升级。在这个页面的步骤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;
}
133027 次浏览

首先,确保你正在使用

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

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

现在您不需要使用 ref 来调用身份验证方法。

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

我在 Ionic 上遇到了这个问题,结果发现在使用最新的 Firebase Client 时,我没有包括所有内容。如果你已经将 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,您可以使用 鲍尔(可能是 Ionic 的首选方式)或者使用 Browserify 的 NPM

// 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 Storage (可选)。

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

有点晚了,但如果有人想知道的语法在有角,(或爱奥尼亚4)只是添加到您的。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: [
]
})

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

我有相同的错误 Database 不是一个函数- ,但与 不同的情况你只需要添加

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

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

对于在 React-national-中遇到类似错误的用户(this. _ database. natve.on 不是一个函数)

  1. 运行 pod install-在添加 firebase 新服务(database/auth...)之后
  2. 终止 Metro 捆绑包并使用“ npx response-national start”重新启动它
  3. 运行“ npx response-ativerun-ios”

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

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

我通过在构造函数中给出 URL 来解决这个问题 Database (“ https://123.firebaseio.com”)

使用

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

npm install --save firebase

然后:

require("firebase/database");

您需要添加所有的防火基地产品,您正在使用的方式 require()如上所示。