前提・実現したいこと
FirebaseとNext.jsでSNSを作っています。
ユーザーのIDを任意の値に変更できる機能を実装しようとしています。
ユーザーが新たに設定しようとしたIDと、他のユーザーのIDと一致しなければ変更を許可、一致するユーザーがいれば、変更を許可せずそのIDが使えない旨をユーザーに表示したいです。
発生している問題・エラーメッセージ
IDが一致するユーザーを返してほしいですが返ってこないです。
該当のソースコード
アカウント登録時に、下記のようにuuidを生成して返す関数によって、デフォルトのユーザーIDはuuidを設定しています。
javascript
1const newUser = { 2 name: firebase.auth().currentUser.displayName, 3 id: generateUUID(), 4} 5await usersRef.set({ 6 name: newUser.name, 7 id: newUser.id, 8}); 9 10// グローバルステートにセット 11setUser(newUser);
FireStoreのダッシュボードでは下記のような表示になっています。
users | j9440as09eg09aae0gasd | name: hoge id: adogoasidj03-adjjgae3goie
IDの変更コンポーネントは、おおむね下記のようになっています。
javascript
1const { user } = useAuth(); 2const inputIDRef = useRef(); 3 4const save = () => { 5 // ユーザーが入力した新規IDを取得 6 const newID = inputIDRef.current.value; 7 if(user.id === newID) return console.log("元のIDと一緒やで。"); 8 // ユーザー全体取得 9 const usersRef = firebase.firestore().collection("users"); 10 // idフィールドの値と入力IDが一致するものを取得 11 userRef.where("id", "==", newID).then(async (snapshot) => { 12 // ↓取得したものが空でない = IDが一致するユーザーがいる 13 if(!snapshot.empty) return console.log("IDが一致するユーザーがいるからダメ。"); 14 // ↓取得したものが空だった = IDが一致するユーザーがいない → DBに保存してよし 15 const currentUserDoc = usersRef.doc(currentUser.uid); 16 await currentUserDoc.update({ 17 id: newID, 18 }); 19 }) 20} 21 22return ( 23 <> 24 <input type="text" ref={inputIDRef} defaultValue={user.id} /> 25 <button onClick={save}>設定を更新</button> 26 </> 27)
inputの初期値に元のIDを入れているのでただちにsave関数を実行すれば、元のIDとinputのIDが一致するはずで、「スナップショットが空ではない」という挙動を期待していますが、現状はスナップショットが空で返ってきます。
上記コードのコメントに書いたアルゴリズムは問題なさそうなので、何かしらの初歩的なミスやクエリの書き方の問題だと思われるのですが、具体的にどこがどう間違っているかが分からないので、ご教示いただきたいです。
あなたの回答
tips
プレビュー