簡體   English   中英

Firebase的set()在onAuthStateChanged()內部不起作用

[英]Firebase's set() not working inside onAuthStateChanged()

目前,我正在使用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()都起作用。 但是,當我在onAuthStateChanged()調用set() onAuthStateChanged()沒有。

我的數據庫規則是:

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

我想念什么嗎?

謝謝

正如@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');
                    }
                );


            }
        });
    }

現在,當用戶登錄時將其添加到數據庫中。 我也用過once() on()方法更改了on()方法,因為即使我直接從Firebase控制台刪除它,它也正在添加用戶。

現在要將日期添加到lastActivityItem我只需要將toString()方法添加到生成的日期中,如下所示:

let d = new Date()

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

如果有人知道為什么會這樣,請分享。

謝謝@bennygenel !!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM