База данных firebase.data не является функцией
Я пытаюсь обновить версию более ранней версии 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 account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});
return deferred.promise;
}
Ответы
Ответ 1
Я столкнулся с этим с помощью Ionic, и оказалось, что я не включал все, когда использовал последний Firebase Client. Если вы включили 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 Setup Docs
Вы можете уменьшить количество кода, которое использует ваше приложение, просто включив необходимые функции. Индивидуально устанавливаемые компоненты:
firebase-app - основной клиент firebase (обязательно).
firebase-auth - Аутентификация Firebase (необязательно).
База данных firebase - База данных реального времени Firebase (необязательно).
Хранилище огня - Хранилище пожарной базы (необязательно).
Из CDN включите отдельные компоненты, которые вам нужны (сначала включите firebase-приложение)
Ответ 2
Немного поздно для вечеринки, но если кто-то захочет узнать синтаксис в угловом (или 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: [
]
})
Ответ 3
Сначала убедитесь, что вы используете
<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
});