我目前正在开发我的第一个"大"使用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()
都有效。但是当我在set()
内拨打onAuthStateChanged()
时,它就没有了。
我的数据库规则是:
{
"rules": {
".read": true,
".write": "auth != null"
}
}
我错过了什么吗?
由于
答案 0 :(得分:0)
正如@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');
}
);
}
});
}
现在当用户登录时将其添加到数据库中。我还使用on()
更改了once()
方法,因为即使我直接从Firebase控制台删除,它也会添加用户。
现在要将日期添加到lastActivityItem
我只需要将toString()
方法添加到生成日期,如下所示:
let d = new Date()
let userInfo = {
lastActivityTime: d.toString()
}
如果有人知道为什么会这样,请分享。
谢谢@bennygenel !!!