[英]Firebase's set() not working inside onAuthStateChanged()
目前,我正在使用Firebase作為數據庫,使用ReactJS開發我的第一個“大型” Web應用程序。 一切順利,直到我遇到這個問題。
當他們使用Facebook或Twitter登錄應用程序時,我試圖保存用戶信息,而我使用的是Firebase提供的方法,如下所示:
authenticate(option){
let provider;
switch (option) {
case 'facebook':
provider = new firebase.auth.FacebookAuthProvider();
break;
case 'twitter':
provider = new firebase.auth.TwitterAuthProvider();
break;
default:
provider = 'no-provider'
break;
}
if(provider !== 'no-provider'){
firebase.auth().signInWithPopup(provider).then((result) => {
console.log("Login with " + provider + " ok!");
console.log(result);
}).catch((error) => {
console.log("Error: there was an error trying to login.");
});
}
}
但是,當我嘗試將用戶登錄后將其保存到數據庫中時,什么也沒有發生。
這就是我在App.js上擁有的
componentDidMount() {
base.auth().onAuthStateChanged((loggedUser) => {
if (loggedUser) {
this.setState({
userName: loggedUser.displayName,
userPhoto: loggedUser.photoURL,
userUID: loggedUser.uid
});
base.database().ref('users/' + loggedUser.uid).on('value',
(user) => {
if (user.val() !== null) {
if (user.val().votedAlbums !== undefined) {
this.setState({
votedAlbums: user.val().votedAlbums
});
}
} else {
console.log(loggedUser.uid);
let userInfo = {
lastActivityTime: new Date()
}
base.database().ref('users/' + loggedUser.uid).set(userInfo).then((ref) =>{
console.log(ref); // this logs 'undefined'
}).catch((error) => {
console.log(error);
});
}
},
(err) => {
this.props.history.push('/error');
}
);
}
});
}
我嘗試將用戶保存在另一個函數上,並且update()
和set()
都起作用。 但是,當我在onAuthStateChanged()
調用set()
onAuthStateChanged()
沒有。
我的數據庫規則是:
{
"rules": {
".read": true,
".write": "auth != null"
}
}
我想念什么嗎?
謝謝
正如@bennygenel所建議的,我將lastActivityTime
的值更改為一個簡單的字符串,如下所示:
componentDidMount() {
base.auth().onAuthStateChanged((loggedUser) => {
if (loggedUser) {
this.setState({
userName: loggedUser.displayName,
userPhoto: loggedUser.photoURL,
userUID: loggedUser.uid
});
base.database().ref('users/' + loggedUser.uid).once('value',
(user) => {
if (user.val() !== null) {
if (user.val().votedAlbums !== undefined) {
this.setState({
votedAlbums: user.val().votedAlbums
});
}
} else {
console.log(loggedUser.uid);
let userInfo = {
lastActivityTime: "whatever" // replaced new Date() with "whatever"
}
base.database().ref('users/' + loggedUser.uid).set(userInfo).then((ref) =>{
console.log(ref);
}).catch((error) => {
console.log(error);
});
}
},
(err) => {
this.props.history.push('/error');
}
);
}
});
}
現在,當用戶登錄時將其添加到數據庫中。 我也用過once()
on()
方法更改了on()
方法,因為即使我直接從Firebase控制台刪除它,它也正在添加用戶。
現在要將日期添加到lastActivityItem
我只需要將toString()
方法添加到生成的日期中,如下所示:
let d = new Date()
let userInfo = {
lastActivityTime: d.toString()
}
如果有人知道為什么會這樣,請分享。
謝謝@bennygenel !!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.