前提・実現したいこと
React(Redux)+firebaseの認証機能を使ってログイン処理を行った後に
画面上にサインイン情報を表示させようとしています。
下記動画を参考にしながら学習しているところです。
https://www.youtube.com/watch?v=PNvLGoop8z8&t=2340s
発生している問題・エラーメッセージ
firebaseのv9でドキュメント情報を取得する処理を実装していたのですが、
データが取得できず下記エラーが出てしまいます。
「Uncaught (in promise) TypeError: snapshot.exists is not a function at operations.js:29:1」
該当コードは以下になります。
JavaScript
1import {signInAction} from './actions'; 2import {push} from 'connected-react-router'; 3import {auth, db} from '../../firebase/index' 4import { doc,getDoc } from 'firebase/firestore'; 5import { 6 signInWithEmailAndPassword 7} from 'firebase/auth' 8 9export const signIn = (email,password) => { 10 return async (dispatch) => { 11 // Validation 12 if (email === "" || password === "") { 13 alert("必須項目が未入力です") 14 return false 15 } 16 17 signInWithEmailAndPassword(auth,email,password) 18 .then(result => { 19 const user = result.user 20 21 if(user) { 22 const uid = user.uid 23 console.log("uid:",uid) 24 25 const docRef = doc(db,"users",uid) 26 const snapshot = getDoc(docRef) 27 28 if (snapshot.exists()) { 29 console.log("snapshot:",snapshot); 30 const data = snapshot.data() 31 dispatch(signInAction({ 32 isSignedIn: true, 33 role: data.role, 34 uid: uid, 35 username: data.username 36 })) 37 } else { 38 console.log("No Such document!:"); 39 } 40 41 dispatch(push('/')) 42 } 43 }) 44 } 45}
firebaseの公式ドキュメントも参考にしながら実装していたのですが、
エラーの解消方法がわからず困っているところです・・・。
https://firebase.google.com/docs/firestore/query-data/get-data?hl=ja#get_a_document
試したこと
[確認1]
上記コードの中でuidを出力する処理を入れて、問題なく取れていることは確認できています。
[確認2]
snapshot変数の中身を確認してみましたが、コンソール出力をしてみた限りでは存在しているように見えます。
[確認3]
下記の記事を参考にgetDoc関数の処理後に[.then]を付けて実装してみたところ、ドキュメント情報を取得できた。
https://reffect.co.jp/react/react-crud-firebase-9
JavaScript
1getDoc(docRef).then((snapshot) => { 2 console.log(snapshot.exists()) 3 console.log(snapshot.data()) 4})
[確認4]
改めて公式ドキュメントを参考として愚直にgetDocの前にawaitを付けてみたが、別のエラーが出てしまう(awaitの使い方に問題がありそう?)。
「Parsing error: Unexpected reserved word 'await'」
signInWithEmailAndPassword(XXX).then(result => {...})という実装のところで[result]の前に[async]を付けると上記エラーが解消されて、求めている処理結果になった。
補足情報(FW/ツールのバージョンなど)
firebase:9.6.6
React:17.0.2
React-redux:7.2.6
npm:8.1.0
回答1件
あなたの回答
tips
プレビュー