【问题标题】:onAuthStateChanged() in firebase or firebase auth does not return valuesfirebase 或 firebase 身份验证中的 onAuthStateChanged() 不返回值
【发布时间】:2020-03-15 10:14:32
【问题描述】:

我正在使用带有 firebase 身份验证的 Angular。 当我使用 onAuthStateChanged 方法知道用户是否登录时,它不会返回用户 甚至当我想检索用户数据时使用 angularfireAuth.currentUser 它给我这个错误: 例如,我使用 afAuth.currentUser.uid 在我的查询函数中使用它

未捕获(承诺中):TypeError:无法读取 null 的属性“uid”

这是我在 authService 的构造函数中调用的代码:

 firebase.auth().onAuthStateChanged(firebaseUser => {
          if (firebaseUser) {
            console.log(firebaseUser.uid)
            this.user.next(firebaseUser)
            return (firebaseUser.uid)
          } else {
            return (null)
          }
    })

我想我必须异步执行,但我不知道怎么做? 有什么想法吗?

【问题讨论】:

    标签: angular firebase firebase-authentication angularfire2


    【解决方案1】:

    由于您使用的是 angularfire,我建议您收听authState。我看到您正在暴露某种可观察的主题,因为您正在调用next。但我会将authState 中的值分配给一个可观察对象,您可以订阅它以获取实时更改,因为每当authState 发生更改时都会触发。

    服务:

    import { User } from 'firebase';
    
    // ...
    
    user$: Observable<User | null>;
    
    constructor(
        private afAuth: AngularFireAuth
    ) {
        this.user$ = this.afAuth.authState;
    }
    

    然后在你的组件中你可以订阅user$:

    this.myService.user$.subscribe(....)
    

    这里虽然你需要记住在组件被销毁时取消订阅!

    你也可以在服务中写一个函数,一次返回用户,不用担心退订。

    服务代码与上面相同,但添加:

    getUser() {
      return this.user$.pipe(first())
    }
    

    现在,当您在组件中订阅此函数时,您的用户只会被发出一次。

    如果您需要在其他依赖于uid 的异步函数中使用此用户,您可以使用switchMapmergeMap 链接这些请求。所以你能做的就是……

    this.myService.getUser().pipe(
      switchMap((user: User) => {
        return this.getCat(user.uid)
      })
    // will console true or false
    ).subscribe(data => console.log(data))
    

    【讨论】:

    • 非常感谢,我可以在订阅功能后立即取消订阅吗?像这样:this.myService.user$.subscribe(....).unsebscribe(); ?
    • 我如何在这个函数中使用 getUser() ? this.afs.collection('users').doc().collection('categories').get()
    • 如果你只想要用户 once 然后使用我提供的getUser 函数。如果您的下一个请求取决于user,我还添加了一个示例来说明如何链接请求。请阅读链接文档以进一步了解 switchMapmergeMap 的工作原理。
    • 你能给我返回当前用户ID的功能吗?我对 angular 和 rxjs 都太笨了:(
    • 我只想将变量设置为等于该变量并在其他函数中使用它,但是当我没有将数据显示到控制台时,它给了我未定义的设置,将 id(variable) 设置为 data.uid跨度>
    【解决方案2】:

    您是否将该代码包装到一个函数中并在页面加载时调用该函数?也许尝试将其包装在一个函数中并在页面首次加载时调用 loginStatus 函数

    function loginStatus() { 
        firebase.auth().onAuthStateChanged(firebaseUser => {
          if (firebaseUser) {
            console.log(firebaseUser.uid)
          this.user.next(firebaseUser)
          return (firebaseUser.uid)
        } else {
          return (null)
        }
      })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2019-10-20
      • 2023-04-03
      • 1970-01-01
      • 2018-10-30
      • 2020-05-17
      • 1970-01-01
      相关资源
      最近更新 更多