React JS集成Firebase Auth报错:logIn is not a function
搭建React+Firebase邮箱认证系统时
logIn is not a function错误的解决方法 我跟着视频教程用React JS和Firebase Auth搭建简易邮箱认证系统,运行时触发错误:logIn is not a function,错误出在Login.jsx中handleSubmit函数的catch语句里。克隆教程作者的仓库后代码能正常运行,且我的handleSubmit逻辑和作者完全一致,因此判断问题出在其他环节。此前查阅同类帖子未找到有效方案,现将解决过程分享给后续开发者。
问题原因与修复方案
问题已解决!最初为避免解构失败,我在Login.jsx中写了const { logIn } = UserAuth() | {};,这导致logIn被赋值为undefined,React因此判定它不是函数。
修复步骤:
- 将App.js整个组件包裹在
AuthContextProvider中,确保Login组件能正确获取到上下文 - 移除Login.jsx中的
| {},改为const { logIn } = UserAuth();
相关代码文件
firebaseConfig.js
// 导入所需的SDK函数 import { initializeApp } from "firebase/app"; import { getAnalytics } from "firebase/analytics"; import { getAuth } from "firebase/auth"; // TODO: 添加你需要使用的Firebase产品SDK // 你的Web应用Firebase配置 // 对于Firebase JS SDK v7.20.0及更高版本,measurementId是可选的 const firebaseConfig = { apiKey: process.env.REACT_APP_FIREBASE_API_KEY, authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN, databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL, projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID, storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET, messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID, appId: process.env.REACT_APP_FIREBASE_APP_ID, measurementId: process.env.REACT_APP_FIREBASE_MEASUREMENT_ID, }; // 初始化Firebase const app = initializeApp(firebaseConfig); export const analytics = getAnalytics(app); export const auth = getAuth(app); export default app;
AuthContext.js
import { createContext, useContext, useEffect, useState } from "react"; import { signInWithEmailAndPassword, signOut, onAuthStateChanged, } from "firebase/auth"; import { auth } from "../firebaseConfig"; const AuthContext = createContext(); export const AuthContextProvider = ({ children }) => { const [user, setUser] = useState({}); const logIn = (email, password) => { return signInWithEmailAndPassword(auth, email, password); }; const logOut = () => { return signOut(auth); }; useEffect(() => { const unsubscribe = onAuthStateChanged(auth, (currentUser) => { console.log(currentUser); setUser(currentUser); }); return () => { unsubscribe(); }; }, []); return ( <AuthContext.Provider value={{ user, logIn, logOut }}> {children} </AuthContext.Provider> ); }; export const UserAuth = () => { return useContext(AuthContext); };
Login.jsx(错误触发位置,已修复)
import React, { useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import { UserAuth } from "../context/AuthContext"; const Login = () => { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(""); const navigate = useNavigate(); // 修复后的代码:移除了| {} const { logIn } = UserAuth(); const handleSubmit = async (e) => { e.preventDefault(); setError(""); try { await logIn(email, password); navigate("/account"); } catch (e) { setError(e.message); // <--- 原错误触发位置 console.log(e.message); } }; return ( <div className="max-w-[600px] mx-auto my-16 p-4"> <div> <h1 className="text-2xl font-bold py-2">登录你的账户</h1> </div> <form onSubmit={handleSubmit}> <div className="flex flex-col py-2"> <label className="py-2 font-medium">邮箱地址</label> <input onChange={(e) => setEmail(e.target.value)} className="border p-2" type="email" /> </div> <div className="flex flex-col py-2"> <label className="py-2 font-medium">密码</label> <input onChange={(e) => setPassword(e.target.value)} className="border p-2" type="password" /> </div> <button className="border border-blue-500 bg-blue-600 hover:bg-blue-500 w-full p-4 my-12 text-white"> 登录 </button> </form> </div> ); }; export default Login;
package.json
{ "name": "sa_react_firebase_database", "version": "0.1.0", "private": true, "dependencies": { "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "dotenv": "^16.4.5", "firebase": "^10.12.2", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.23.1", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": [ "react-app", "react-app/jest" ] }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] }, "devDependencies": { "autoprefixer": "^10.4.19", "postcss": "^8.4.38", "tailwindcss": "^3.4.4" } }
内容的提问来源于stack exchange,提问作者LimeDev
相关产品推荐
相关产品推荐

