【发布时间】:2017-10-17 12:47:53
【问题描述】:
我目前正在使用 Firebase 作为我的数据库,使用 ReactJS 开发我的第一个“大型”网络应用程序。在我遇到这个问题之前,一切都很顺利。
当他们使用 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() 时,它不会。
我的数据库规则是:
{
"rules": {
".read": true,
".write": "auth != null"
}
}
我错过了什么吗?
谢谢
【问题讨论】:
-
能不能在用
console.log(loggedUser.uid)的set方法之前确认loggedUser.uid不为空 -
@bennygenel 是的,不为空。我只测试了一位用户。我做了一个
console.log(loggedUser);并且 uid 在那里。 -
你在哪里登录的?在
on('value', ....)的回调中? -
不,在那之前。设置后
this.setState() -
请在else语句后检查。因为
on(..)方法是异步的,它可能会失去它的价值。
标签: javascript node.js reactjs firebase firebase-authentication