reactjs - TypeError: _firebase__WEBPACK_IMPORTED_MODULE_3__.default.auth 不是使用 firebase/react 进行身份验证的函数登录
问题描述
我正在尝试使用 firebase 进行简单的登录/注册表单身份验证并做出反应,但是当我尝试加载页面时,我不断收到此错误。“TypeError: firebase__WEBPACK_IMPORTED_MODULE_3 _.default.auth is not a function” 这是一个包含 3 个页面的简单应用程序。首先应该是登录页面,然后如果登录详细信息正确,则应该将您重定向到主页。我的 firebase.js 文件包含通常的配置文件。最后,我像这样导出该文件。
const fireDb = firebase.initializeApp(firebaseConfig);
export default fireDb.database().ref();
我不太确定我在这里错过了什么,也许只是一个错字?也许我应该导入一些其他模块?任何帮助将不胜感激。在我的 Login.js 代码下方。
登录.js
import React, { useState, useEffect } from "react";
import "./Login.css";
import { useHistory } from "react-router-dom";
import fireDb from "../firebase";
function Login() {
const history = useHistory();
const [user, setUser] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [emailError, setEmailError] = useState("");
const [passwordError, setPasswordError] = useState("");
const clearInputs = () => {
setEmail("");
setPassword("");
};
const clearErrors = () => {
setEmailError("");
setPasswordError("");
};
const handleLogin = () => {
clearErrors();
fireDb
.auth()
.signInWithEmailAndPassword(email, password)
.then((auth) => {
history.push("/HomePage");
})
.catch((err) => {
// eslint-disable-next-line default-case
switch (err.code) {
case "auth/invalid-email":
case "auth/user-disabled":
case "auth/user-not-found":
setEmailError(err.message);
break;
case "auth/wrong-password":
setPasswordError(err.message);
break;
}
});
};
const handleSignup = () => {
clearErrors();
fireDb
.auth()
.createUserWithEmailAndPassword(email, password)
.then((auth) => {
if (auth) {
history.push("/HomePage");
}
})
.catch((err) => {
// eslint-disable-next-line default-case
switch (err.code) {
case "auth/email-already-in-use":
case "auth/invalid-email":
setEmailError(err.message);
break;
case "auth/weak-password":
setPasswordError(err.message);
break;
}
});
};
const authListener = () => {
fireDb.auth().onAuthStateChanged((user) => {
if (user) {
clearInputs();
setUser(user);
} else {
setUser("");
}
});
};
useEffect(() => {
authListener();
}, []);
return (
<div className="login">
<div className="login__container">
<h1>Sign-in</h1>
<form>
<h5>E-mail</h5>
<input
type="text"
autoFocus
required
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<p className="errorMsg">{emailError}</p>
<h5>Password</h5>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<p className="errorMsg">{passwordError}</p>
<button
type="submit"
onClick={handleLogin}
className="login__signInButton"
>
Sign In
</button>
</form>
<button onClick={handleSignup} className="login__registerButton">
Create your Account
</button>
</div>
</div>
);
}
解决方案
既然你这样做:
export default fireDb.database().ref();
你实际上是在打电话:
fireDb.database().ref().auth()
如果您检查参考文档,您会注意到DatabaseReference
没有auth()
方法。
FirebaseApp
我建议改为导出对象:
export default fireDb;
然后导入它:
import firebase from "../firebase";
和:
const fireDb = firebase.database().ref();
const fireAuth = firebase.auth();
或者,您可以保留当前的导出和导入并FirebaseAuth
使用:
fireDb
.app
.auth()
.signInWithEmailAndPassword(email, password)
...
推荐阅读
- c++ - 修剪 std::string 和 std::wstring
- node.js - pm2 内存使用和进程数不断上升
- python-3.x - 如何将循环中给出的所有值输入到列表中?
- sql - 在“AS”之前或之后声明变量有什么区别?
- python - matplotlib 直方图箱移位和单个数据标签
- javascript - 切换到 Iframe 错误:无效参数:'id' 不能是字符串
- java - 如何,在开启wifi和移动网络的情况下,在android上是选择通过移动网络传输数据吗?
- node.js - next() 在中间件中的使用
- c# - 在 asp.net mvc 5 中具有不同控制器的独特 slug 路由
- php - Flutter Laravel:使用 Dio 和 ImagePicker 上传图片