0

현재 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 제안으로

감사

+0

'console.log (loggedUser.uid) '가있는 set 메소드가 실행되기 전에'loggedUser.uid'가 비어 있지 않음을 확인할 수 있습니다. – bennygenel

+0

@bennygenel 예, 비어 있지 않습니다. 한 명의 사용자 만 테스트했습니다. 나는'console.log (loggedUser); '를했고 거기에 uid가 있었다. –

+0

어디에서 로그인 했습니까? 'on ('value', ....) 콜백 내부에서? – bennygenel

답변

0

는,이 같은 간단한 문자열로 lastActivityTime의 값을 변경했습니다. firebase 콘솔에서 직접 삭제 한 경우에도 사용자를 추가했기 때문에 메서드를 once()으로 변경했습니다.

지금 lastActivityItem에 날짜를 추가하는 I는이 같은 생성 된 날짜로 toString() 방법을 추가 할 수 있습니다

let d = new Date() 

let userInfo = { 
    lastActivityTime: d.toString() 
} 

을 누군가가 이런 일이 왜, 공유하시기 바랍니다 알고있는 경우.

감사합니다. @bennygenel !!!

+0

왜냐하면'new Date'는 날짜 객체이기 때문에 문자열을 사용해야합니다. 일부 toString 메서드 또는 getTime 메서드를 사용할 수 있습니다. – bennygenel

관련 문제