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

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

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

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

React.js

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

Q&A

解決済

2回答

737閲覧

配列の戻り値の結果がundefinedになる。

tttniaeefe

総合スコア13

Firebase

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

React.js

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

0グッド

0クリップ

投稿2021/10/19 01:46

編集2021/10/19 01:49

前提・実現したいこと

firestoreのドキュメントからユーザー情報を取得し、その結果を配列で取得したいのですが、
呼び出し元でundefinedが返されます。なぜ取れないのか理由を教えていただけないでしょうか。

以下のように、ドキュメントを取得する定義を行い、

該当のソースコード

export const initGet = async (uid) => { const user = await query(collection(db, "users"), where("uid", "==", uid)); return await getDocs(user).then((querySnapshot) => { querySnapshot.forEach((doc) => { let users = []; users.push({ uid: doc.data().uid, name: doc.data().name, email: doc.data().email, image: doc.data().image, areaId: doc.data().areaId, buisinessId: doc.data().buisinessId, }); console.log(users); ⇐"この時点では配列取得が可能" return users; }); }); };

呼び出し先では以下のようにしています。

 const currentUser = useContext(AuthContext); useEffect(() => { fetch(); }, [currentUser]); //usecontextが取れていない状態でfetchが走らないようdigで分岐を行う const fetch = async () => { if (dig(currentUser, "currentUser", "uid")) { const data = await initGet(currentUser.currentUser.uid); ⇐"undefined" await setUsers(data); }

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

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

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

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

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

FKM

2021/10/19 06:33 編集

useContextフックで橋渡ししようとしている親コンポーネントのJSXの部分を提示してください。
tttniaeefe

2021/10/19 07:13 編集

以下のように設定しています。 export const AuthContext = React.createContext(); export const AuthProvider = ({ children }) => { const [currentUser, setCurrentUser] = useState(null); useEffect(() => { auth.onAuthStateChanged(setCurrentUser); }, []); return ( <AuthContext.Provider value={{ currentUser }}>   {children} </AuthContext.Provider> );
guest

回答2

0

ベストアンサー

親コンポーネントからuseContextフックで橋渡しする場合はこれでいいのでは?子コンポーネントで受け皿としてcurrentUserが橋渡しされている状態なので、二重にcurrentUserは不要じゃないかと思われます。

js

1 const fetch = async () => { 2  const { currentUser } = useContext(AuthContext) 3  console.log(currentUser) //確認するとcurrentUser直下にメンバが代入されるはずです 4 if (dig(currentUser, "currentUser", "uid")) { 5 const data = await initGet(currentUser.uid); 6 await setUsers(data); 7 }

JSXの記述は自分も勘違いがあったのでこっちの環境でも検証してみました。質問文で正しいですが、二重リテラルではなく

value={ //ここはjsxのルール上のオブジェクトリテラル(変数代入用) { currentUser } //ここはオブジェクトのリテラル(代入された変数) }

いわばこのような状態になっているので。

投稿2021/10/19 07:59

編集2021/10/20 00:41
FKM

総合スコア3633

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

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

tttniaeefe

2021/10/19 13:05 編集

currenuUserはオブジェクトリテラルなので、{{ currentUser }}としています。 currentuser中身は以下です。 ``` ▼{currentUser: UserImpl}  ▼currentUser: UserImpl   displayName: "sample name"   ...   uid: "eh2bvoqr0kbyR8wBbvdB1NU88QL2" ``` ちなみにcurrentUser.currentUser.uidの値は問題なく取れています。
tttniaeefe

2021/10/20 01:46 編集

以下の記事を参考にしながら、currentUserの中身を直下表示できるようになりました。 https://reffect.co.jp/react/react-firebase-auth#Cotext ⇛6 ユーザ情報の共有(Cotext) valueに渡す前に以下のようにしておかないと、表示ができませんでした。 const value = { currentUser, }; <AuthContext.Provider value={value}>... しかし、未だundefinedが返ってきます。。
tttniaeefe

2021/10/20 08:57

回答いただきありがとうございました。
guest

0

return文に問題があることが発覚しました。

export const initGet = async (uid) => { let users = []; const user = await query(collection(db, "users"), where("uid", "==", uid)); await getDocs(user).then((querySnapshot) => { querySnapshot.forEach((doc) => { users.push({ uid: doc.data().uid, name: doc.data().name, email: doc.data().email, image: doc.data().image, areaId: doc.data().areaId, buisinessId: doc.data().buisinessId, }); console.log(users); }); }); return users; };

投稿2021/10/20 08:54

tttniaeefe

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問