Next.js(App Router)のアプリケーションで、Firebaseを使ったログイン機能をつけようとして出たエラーへの対応ログです。
Next.jsでFirebaseを利用する手法については直接扱わないのですが、以下の記事がとても参考になりましたので、紹介しておきます😚
以下のような実装でログインフォームを作って、Firebaseで認証をしようとしたある日のこと。
'use client'; import React from 'react'; import { signInWithEmailAndPassword } from 'firebase/auth'; import { auth } from '@/firebase/client'; const LoginForm = (): React.ReactElement => { const [email, setEmail] = React.useState(''); const [password, setPassword] = React.useState(''); const handleLogin = async (): Promise<void> => { await signInWithEmailAndPassword(auth, email, password) .then((userCredential) => { const user = userCredential.user; // ログインができたかどうかを簡単に示す alert('ログインOK!'); }) .catch((error) => { console.log(error); }); }; return ( <> <form> <input type="text" id="sign-in-email" onChange={(e) => { setEmail(e.target.value); }} placeholder="Your email" /> <input type="password" id="sign-in-email" onChange={(e) => { setPassword(e.target.value); }} placeholder="Your password" /> <button onClick={handleLogin} type="submit" > Login </button> </form> </> ); }; export default LoginForm;
ログインできるはずのemail & passwordを入力してLoginボタンを押すと、firebaseと通信するためのAPI_KEYの設定が正しいはずなのに"network-request-failed"に。
色々調べた結果、↑は「"素のformタグ"を使っていたから」ということがわかりました。
というのもこの実装では、formタグで囲ったLoginボタンを押すとページの更新が走ってしまうために、せっかくbuttonのonClickで処理しようとしていたfirebaseでの認証処理が中断されてエラーが発生していたのです。
ということで、私は囲っているformタグを削除してエラー解消に成功しました。
ちなみにこのエラーは「認証の処理中にページの更新が走った」ことが本質的な原因ですが、handleLoginをformタグのonSubmitで呼び出すことでは回避できませんでした。多分非同期処理を書いた関数をawaitつけずに呼んでるからだとおもう。