0

我目前正在開發我的第一個使用Firebase作爲我的數據庫的ReactJS的「大」web應用程序。一切都很順利,直到我遇到這個問題。Firebase的set()不在裏面onAuthStateChanged()

我想保存登錄時,與Facebook或Twitter應用程序的用戶信息,我使用的火力地堡這樣提供的方法:

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()它不。

我的DB規則是:

{ 
    "rules": { 
    ".read": true, 
    ".write": "auth != null" 
    } 
} 

我缺少的東西?

感謝

+0

您可以使用'console.log(loggedUser.uid)' – bennygenel

+0

@bennygenel確認'loggedUser.uid'在設置方法之前是否爲空。是的,不是空的。我只測試過一個用戶。我做了一個'console.log(loggedUser);'和uid在那裏。 –

+0

你在哪裏登錄?在'on('value',....)'的回調中? – bennygenel

回答

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 !!!

+0

它因爲'新日期'是一個日期對象,你需要將它串聯起來。您可以使用一些toString方法或getTime方法 – bennygenel

相關問題