1

firebase の authState からユーザーを取得するアクションがあります。ユーザーが存在する場合、コードはユーザーに関連するドキュメントを返します。そうでない場合は、of(null)以下が返されます。

クラスAuthState

ngxsOnInit({dispatch}: StateContext<AuthStateModel>) {
  dispatch(SyncAuth);
}

@Action(SyncAuth)
syncAuth({dispatch}: StateContext<AuthStateModel>) {
  return this.afAuth.authState.pipe(
    switchMap(fireAuth => fireAuth ? this.authService.auth$(fireAuth.uid) : of(null)),
    tap(user => dispatch(new PatchUserData(user)))
  );
}

クラスAuthService

auth$(userId: string): Observable<User> {
  if (!userId) {
    return of(null);
  }

  return this.db.doc$(`users/${userId}`).pipe(
    map(user => user ? this.transform({...user, id: userId}) : null),
    shareReplay(1)
  );
}

シンプルに見えますよね?まあ、Redux Devtools プラグインがオンになっていない限り、うまくいきません (ええ、私はそれが奇妙であることを知っています)。

switchMap 演算子内で任意の型 (数値、文字列、null、または未定義など) の値を持つオブザーバブルを返したい場合、次のエラーが発生します。

Uncaught TypeError: ストリームが必要な場所に無効なオブジェクトを指定しました。Observable、Promise、Array、または Iterable を提供できます。(zone.js:192)

at subscribeTo (subscribeTo.js:41)
at subscribeToResult (subscribeToResult.js:6)
at SwitchMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/switchMap.js.SwitchMapSubscriber._innerSub (switchMap.js:47)
at SwitchMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/switchMap.js.SwitchMapSubscriber._next (switchMap.js:40)
at SwitchMapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
at angularfire2.js:49
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:388)
at Object.onInvoke (core.js:3820)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:387)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.run (zone.js:138)

問題のある行は私のAuthStateクラスにあります:

// fireAuth === null
switchMap(fireAuth => fireAuth ? this.authService.auth$(fireAuth.uid) : of(null)),

しかし、of演算子を削除してauthService.auth$observable の結果 ( を返すof(null) を返すと、エラーはなくなります。

4

1 に答える 1