【发布时间】:2020-11-12 18:53:03
【问题描述】:
当用户登录时,我试图将他们发送到受限页面。所以我通过检查用户对象来保护路由。问题是当用户创建或登录时,auth 不会立即更改,因此在创建或登录后,firebase.auth().currentUser 可以在几毫秒内返回null。因此,如果我将它们发送到页面,它将返回错误。
这就是我试图让路由等待一段时间以查看身份验证是否更改的尝试。我想知道代码是否有任何问题或编写此代码的更好方法。
附:我知道我可以检查firebase.auth().onAuthStateChanged,但我不明白如何在用户创建或登录时使用它。它只是在后台运行,当身份验证更改时我不能只向用户发送路由没有语境。它也没有超时。
getUser( { commit } ) {
return new Promise( ( resolve, reject )=> {
let user, i = 0
function checkForUser() {
setTimeout( ()=> {
i++
user = firebase.auth().currentUser
if ( user ) {
router.push( { path: '/restricted' } )
resolve()
} else if ( i > 30 ) {
reject( { message: 'Something went wrong, please try again.' } )
} else {
checkForUser()
}
}, 100 )
}
checkForUser()
} )
},
【问题讨论】:
-
似乎您还想显示登录用户的代码,因为您在此处显示的内容取决于其他代码,以及您可能如何处理其结果。跨度>
-
有一个很长的 GitHub 问题(他们需要很长时间才能修复 IMO),列出了一些很好的解决方法 ~ github.com/firebase/firebase-js-sdk/issues/462
-
@DougStevenson 我实际上在需要用户对象存在的几个不同地方使用它。所以我可以运行这个函数并等待它通过或失败。但不知何故感觉有点乱,想知道是否有更清洁的方法来做到这一点。
-
@Phil 我已经看到了线程,但解决方案似乎没有处理超时,如果用户对象没有被填充,就会卡住。
标签: javascript firebase vue.js firebase-authentication vuex