我的功能如下:
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]
我很困惑,因为我在不同的模块中使用了类似的东西,而且看起来工作正常。鉴于这些错误,我现在担心它会崩溃。任何见解都会非常方便。
预先感谢
答案 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;