You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Fire Auth页面刷新后无法获取Firestore用户数据问题

Firebase Auth + Firestore 用户数据获取问题及解决

背景

我使用Firebase Authentication实现了邮箱密码注册登录功能,登录函数运行正常,登录后执行了以下代码:

await setPersistence(this.auth, browserLocalPersistence);

创建新用户后将用户数据保存至Firestore的操作也正常。

问题描述

在auth.service.ts中,我尝试通过auth.currentUser获取Firestore中的用户文档,开发者工具确认持久化功能正常,始终能正确获取到currentUser。

最初的实现代码如下:

this.auth.onAuthStateChanged(user => {
  console.log('FIRE AUTH ON AUTH STATE CHANGED RUNNING', user);
  if (user) {
    this.user$ = of(user).pipe(
      switchMap(async user => {
        try {
          const res = await getDoc(doc(this.db, 'users', user.uid));
          console.log(res.data());
          return res.data() as FireUser;
        } catch (error) {
          console.error(error);
          return null;
        }
      })
    );
  } else {
    this.user$ = of(null);
  }
});  

登录后这段代码运行正常,但页面刷新后(仍能正确获取currentUser),代码无法进入switchMap,且无任何报错。我已在onAuthStateChanged开头打印user,确认其值正确。

我还尝试过另一种写法:

onAuthStateChanged(this.auth, user => {
  console.error('USER IS', user);
  if (user) {
    this.user$ = docData(
      doc(this.db, 'users', user.uid)
    ) as Observable<FireUser>;
  } else {
    this.user$ = of(null);
  }
});

组件中通过以下方式展示user$数据:
TS代码:

user$ = this.fireAuthService.user$;  

HTML代码:

<div *ngIf="user$ | async as user">
  <pre>
   {{ user | json }}
 </pre>
</div>

请问问题出在哪里?

最终解决方案

基于@Werner7的回答,修改后的代码如下:

private userSubject$ = new BehaviorSubject<FireUser>(null);

get user$(): Observable<FireUser> {
  return this.userSubject$.asObservable();
}

onAuthStateChanged(this.auth, async user => {
  console.error('USER IS', user);
  if (user) {
    this.userSubject$.next(
      (await getDoc(doc(this.db, 'users', user.uid))).data() as FireUser
    );
  } else {
    this.userSubject$.next(null);
  }
});

内容的提问来源于stack exchange,提问作者Máté Antal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:57:17