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
) を返すと、エラーはなくなります。