firebase.auth()。currentUser.uid-找不到未定义的uid

时间:2019-09-04 13:40:26

标签: javascript firebase react-native firebase-realtime-database firebase-authentication

我的功能如下:

recieveUserData = async() =>{

console.log(firebase.auth().currentUser.uid);
let user =firebase.auth().currentUser.uid;
await firebase.database().ref('/Users/'+user+'/Public').once('value').catch(error=>{console.log("error:" + error)}).then((snapshot)=>{


    //Do something.
})

        }

控制台日志实际生成uid。但是,需要变量'user'并因此需要'firebase.auth()。currentUser.uid'的函数失败:

[Unhandled promise rejection: TypeError: Cannot read property 'uid' of null]. 

我认为也许firebase.auth()可能需要一些时间才能被调用,因此稍后的行错误就会出局。我以为可以通过将上面的内容更改为以下内容来解决此问题:

console.log(firebase.auth().currentUser.uid);
       await firebase.auth()
       .catch(err=>{console.log(err)})
       .then(response=>{console.log(response)});

我本以为可以在.then()中编写以后的行,但出现另一个错误:

Unhandled promise rejection: TypeError: _firebase.default.auth(...).catch is not a function]

我很困惑,因为我在不同的模块中使用了类似的东西,而且看起来工作正常。鉴于这些错误,我现在担心它会崩溃。任何见解都会非常方便。

预先感谢

2 个答案:

答案 0 :(得分:0)

您不需要同时使用同步和异步。

您对'async'和'await'的使用不熟悉。如果您了解“ sync”,则可以看到代码问题。您将其设置为“ async”函数,并将“ await”放入 firebase 中。然后该函数从 firebase 开始,因此未定义'user'的值,并且该函数生成null。这会导致错误。 “ Promise”中的.then与“ async”和“ await”功能相同。

您可以尝试使用此代码吗?

//async
const {currentUser} = await firebase.auth()
let userUid = currentUser.uid

//sync
let userUid;
firebase.auth().then( currentUser => {
   userUid = currentUser.uid
})
.catch(error => console.log(error) )


答案 1 :(得分:0)

最后,我设法测试了是否在父模块的ComponentDidMount中通过了身份验证,并且仅在通过身份验证后才渲染relevent模块。我还使用了firebase.auth()。onAuthStateChanged,因为这将在我通过身份验证后立即更新,即它为firebase提供了足够的时间来返回实际的currentUser而不是null。这意味着我的最初代码/我现在尝试过的所有其他不同解决方案都可以实际工作:

class WholeProject extends Component {


state={
    user:null
}

componentDidMount = () => {
    firebase.auth().onAuthStateChanged((user)=>{
        if (user) {
            this.setState({ user });
        } else {
            this.setState({ user: null });
        }

    });}


render(){
let authenticated;
if (this.state.user === null)
authenticated=<Text>Unauthenticated</Text>;
else authenticated=<Profile user = {this.state.user}/>;


return(
<React.Fragment>
{authenticated}
</React.Fragment>

);

}
}

export default WholeProject;