현재 Firebase를 내 DB로 사용하여 ReactJS로 첫 번째 "큰"웹 앱을 개발하고 있습니다. 이 문제로 건너 올 때까지 모든 것이 잘 진행되고있었습니다.Firebase의 set()이 onAuthStateChanged() 내에서 작동하지 않습니다.
나는 그들이 페이스 북이나 트위터와 응용 프로그램에 로그인 한 사용자 정보를 저장하기 위해 노력하고있어,이 같은 중포 기지에서 제공하는 방법을 사용하고 있습니다 :
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.");
});
}
}
을하지만을 나는 저장하려고하면 DB에 로그인 한 사용자는 아무 일도 일어나지 않습니다.
이 내가 다른 함수에서 사용자를 저장하려고 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()
안에 전화 할 때 그렇지 않습니다.
내 DB의 규칙은 다음과 같습니다
{
"rules": {
".read": true,
".write": "auth != null"
}
}
이 나는 뭔가를 놓치고 있습니까? 그 사용자가 로그인이 DB에 추가 할 때 지금
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');
}
);
}
});
}
을 그리고 : @bennygenel 제안으로
감사
'console.log (loggedUser.uid) '가있는 set 메소드가 실행되기 전에'loggedUser.uid'가 비어 있지 않음을 확인할 수 있습니다. – bennygenel
@bennygenel 예, 비어 있지 않습니다. 한 명의 사용자 만 테스트했습니다. 나는'console.log (loggedUser); '를했고 거기에 uid가 있었다. –
어디에서 로그인 했습니까? 'on ('value', ....) 콜백 내부에서? – bennygenel