javascript - 如何在firebase react js中向经过身份验证的用户添加集合?
问题描述
我正在尝试通过 uid 向经过身份验证的用户添加一个集合。我用useState存储uid,但是当我将它传递给数据库时,它会返回“”。如果我在那里硬编码一些东西,它工作正常。在控制台日志中,我可以看到状态中的 uid,但在提交时,它会提交“”我是新来的反应,所以任何信息都将不胜感激。
import React, { useState } from 'react';
import firebase from 'firebase';
import { db } from '../../firebase';
import Button from '@material-ui/core/Button';
import './SignUp.css';
function SignUp({ history }) {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [checkPassword, setCheckPassword] = useState('');
const [userId, setUserId] = useState('');
console.log(userId);
const handleSignUp = (e) => {
e.preventDefault();
if (password !== checkPassword) {
return alert('Passwords do not match');
}
if (!password) {
return alert('Please enter a password1');
}
firebase
.auth()
.createUserWithEmailAndPassword(email, password)
.then((user) => {
setUserId(user.user.uid);
db.collection('Users').doc(userId).set({
email: user.user.email
});
alert('User Created');
setEmail('');
setPassword('');
setCheckPassword('');
history.push('/');
})
.catch((error) => alert(error));
};
return (
<div className="signup">
<div className="signup__title">Sign Up</div>
<form onSubmit={handleSignUp}>
<div className="signup__card">
<div className="signup__cardLabel">Email</div>
<div className="signup__cardInput">
<input
type="text"
placeholder="username"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</div>
<div className="signup__cardLabel">Password</div>
<div className="signup__cardInput">
<input
type="password"
placeholder="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
</div>
<div className="signup__cardLabel">Check Password</div>
<div className="signup__cardInput">
<input
type="password"
placeholder="password"
value={checkPassword}
onChange={(e) => setCheckPassword(e.target.value)}
/>
</div>
<div className="signup__button">
<Button
type="submit"
variant="contained"
color="primary"
>
Submit
</Button>
</div>
</div>
</form>
</div>
);
}
export default SignUp;
解决方案
setUserId(userId)
是异步的,所以当你运行时它可能没有完成db.collection('Users').doc(userId).set()
。
在您的情况下(至少我可以看到的代码),您不需要将您的 userId 放入您的状态。
只是运行db.collection('Users').doc(user.user.id).set()
。
推荐阅读
- recursion - Scheme中树的最大和
- java - 如何计算算法的复杂度?
- python - 为什么我们需要在 Keras load_model 函数中提到损失函数?
- python - 如何在 Mac 上将 .ui 文件转换为 .py 文件?
- php - 如何强制从 url 下载视频?
- php - Detectlanguage - 致命错误未捕获异常
- .htaccess - 未考虑 QUERY_STRING 重写
- java - java.lang.AssertionError: Status expected:<200> but was:<404> in Junit test
- c# - 如何检测连接客户端是否被修改(服务器:C#,客户端:AS3)
- c++ - range-v3 的 meta::defer 的实现是如何工作的?