前提
Firebase Authenticationでユーザーのログイン機能を実装しています。
サインアップ時に、
- 名前
- アバター
- メールアドレス
- パスワード
以上をFIrestoreに保存しています。
さらに保存したデータをグローバルステートuser
にセットし、複数のコンポーネントでユーザーのアバターと名前を参照して表示しています。
ソースコード
サインアップ時にFirestoreに保存、setStateする関数
tsx
1const currentUser = firebase.auth().currentUser; 2const docRef = await db.collection("users").doc(currentUser.uid); 3// Firestoreにユーザー情報を保存 4await docRef.set({ 5 name: currentUser.displayName, 6 avatar: currentUser.photoURL, 7 email: inputEmail, 8 password: inputPassword, 9 }); 10// 保存したユーザー情報を取得 11const data = await db.collection("users").doc(currentUser.uid).get(); 12// 取得した情報をフロント側で使うためにセット 13setUser(data.data());
ユーザー情報を使用するコンポーネント
tsx
1return ( 2 <> 3 <img src={user.avatar} /> 4 <p>user name: {user.name}</p> 5 </> 6)
ユーザー情報(例:ユーザーの名前)を更新する関数
tsx
1const currentUser = firebase.auth().currentUser; 2const docRef = await db.collection("users").doc(currentUser.uid); 3// 名前を更新 4await docRef.update({name: inputNewName}) 5// 更新した情報を取得 6const doc = await docRef.get(); 7// 更新した情報をセット 8setUser(doc.data());
疑問
firebase.auth().currentUser
に名前(displayName)やアバター(photoURL)の情報があるので、グローバルステートにユーザー情報をセットして参照しなくても、ユーザー情報を表示できます。
しかし、ユーザー情報を更新した際に反映がされないため、Firestore
に保存しています。
とはいえFirebaseの公式ドキュメントのこのページにcurrent_user
の情報を更新する方法が書かれていました。
なので、フロント側(クライアント側)でユーザーの情報を表示する際、どのような方法がよいのでしょうか。
1. 現状の方法
- ユーザー情報を保存または更新する都度、
Firestore
に保存する Firestore
から取得したユーザー情報をグローバルステートにセットする- ユーザー情報を表示する部分で、グローバルステートを参照する
気になる点
ユーザー情報をFirestore
とグローバルステートで二重に管理している状態です。
また、ユーザー情報を保存または更新する都度、Firestore
から情報を取得しセットステートしているのは、なんとなく無駄なことをしている気がしています。
ユーザー情報をフロント側で表示したい部分はグローバルステートから参照するのではなく、直接Firestore
からすればよいのかもしれませんが、ユーザー情報を更新した際、ページをリロードしないとユーザー情報の更新が反映されないかと思います(リロードせずに更新できる方法があるならいいのですが)
2. currentUserだけを使う
- ユーザー情報は
Firestore
に保存しない - ユーザー情報を更新する際は、
updateProfile
メソッドを使用する - ユーザー情報を表示する部分で、
firebase.auth().current_user
のプロパティから参照する
気になる点
ユーザー情報をFirestore
に保存しない場合、どこに保存されるのかがわかりません。
また、サインアウトしたりページをリロードした後に、サインインできなさそうな気がしています。
3. そのほかの方法
一般的だったり、回答者さんなりのベストな方法があれば教えていただきたいです。
そのほか「基本的に1の方法でいいんだけど、現状の方法じゃダメだよ。こうしないと」みたいなことがあれば、教えていただきたいです。
![guest](/img/icon/icnUserSample.jpg)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。