質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

Q&A

解決済

1回答

5533閲覧

Firebaseを利用する際、フロント側で表示するユーザー情報はcurrentUserやFirestoreなど、どこから参照するとよいでしょうか。

TofuLove

総合スコア14

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

0グッド

0クリップ

投稿2020/06/06 02:37

前提

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の方法でいいんだけど、現状の方法じゃダメだよ。こうしないと」みたいなことがあれば、教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Auth(Authentication)とFirestoreの関係性ですが、ユーザー情報の保持という役割においてはFirestoreはAuthの補助的な役割という認識です。必ずしもFirestoreが必要なわけではありません。ただし、Authのほうではnameやemailといった限られた情報しか保存することができません。

https://firebase.google.com/docs/reference/js/firebase.UserInfo?hl=ja

例えば、ショッピングサイトを考えたときに、ユーザーに紐づく購入情報なども保存しないといけないわけですから、Authだけでは実現できないので、Firestoreが必要になってくるわけです。Authだけで十分かどうかは質問者様が保存したい情報によります。注意しなければいけないのはAuthとFirestore両方を使っていたとしてもあくまで別々の管理なので、情報が自動で同期されるとかではなく、開発者がuidをキーにして情報を同期する処理を書かなければいけないことは気に留めておいてください。

また、1に関して言えば、特別な理由がない限りグローバルステートで管理せず、直接APIから取得する形でいいのではないかと思います。リモート(API)とローカル(グローバルステート)の情報を手動で同期させる必要が出てきて、そうでなければおっしゃるとおりリロードしないといけません。

投稿2020/06/06 04:43

markey

総合スコア355

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問