Firebase的set()在onAuthStateChanged()中无法正常工作

时间:2017-10-17 12:47:54

标签: javascript node.js reactjs firebase firebase-authentication

我目前正在开发我的第一个"大"使用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()都有效。但是当我在set()内拨打onAuthStateChanged()时,它就没有了。

我的数据库规则是:

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

我错过了什么吗?

由于

1 个答案:

答案 0 :(得分: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 !!!