角度函数getIdToken不是函数错误

时间:2020-06-28 08:37:07

标签: angular firebase firebase-authentication

我正在尝试使用Firebase身份验证设置Angular应用程序。 我现在的目标是在App初始化期间获取客户端用户的令牌和数据。

在App模块中,我将AuthServise设置为APP_INITIALIZER

 providers: [
    AuthService,
    {
      provide: APP_INITIALIZER,
      useFactory:loadAuthService ,
      deps: [AuthService],
      multi: true
    },

export function loadAuthService(authService: AuthService): Function 
{
  return () => { return authService.load() }; 
}

我的带有“加载”功能的AuthService看起来像这样


    private _token: BehaviorSubject<string>  = new BehaviorSubject<string>(null);
    private _fUser: BehaviorSubject<firebase.User> = new BehaviorSubject<firebase.User>(null);

  // Returns true when user is looged in localStorage of the client
  get isLoggedIn(): boolean {
    return (this.localStorageUser !== null) ? true : false;
  }

  get localStorageUser(): firebase.User {
    return JSON.parse(localStorage.getItem('user'));
  }

  get token(): string {
    return this._token.getValue();
  }

  set token(token: string) {
    this._token.next(token);
  }

  get fUser(): firebase.User {
    return this._fUser.getValue();
  }

  set fUser(fUser: firebase.User){
    this._fUser.next(fUser);
  }

    /**
     * Called and waited on during app initialiation.
     * Initializing app with auth service
     */
    public async load()
    {
      console.log('Initializing app with auth service');
      //Check whether user is in client's local storage
      if (this.isLoggedIn){
        this.fUser = this.localStorageUser;
        const userRef: AngularFirestoreDocument<any> = this.afs.doc(`users/${this.fUser.uid}`);
        try {
          this.token = await this.fUser.getIdToken();
        } catch (error) {
          console.log('getting token error', error);
        }
      }
    }

我不知道为什么我收到错误消息“ this.fUser.getIdToken不是函数” 有什么建议吗?谢谢你。

1 个答案:

答案 0 :(得分:2)

将对象存储在localStorage中时,它会被序列化。您不能像这样存储firebase User对象。而且也没有必要,因为firebase内置了自己的state persistence

您需要设置:

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL)

指示即使在浏览器窗口关闭或Activity在React Native中被破坏时,状态也将保持不变。需要明确注销才能清除该状态。请注意,Firebase Auth Web会话是单个主机来源的,并且只会在单个域中保留。

您还可以考虑使用官方的@angular/fire软件包,该软件包具有很好的可观察性,并且专门针对有角度的容器