我正在用Typescript、React和Firebase(auth和Firestore db)制作一个应用程序。我计划对我的数据进行结构化,以便用户ID用作用户集合中的文档名称。
当用户创建帐户时,我希望:
1.使用Firebase身份验证创建用户帐户
1.使用Firebase auth创建的用户uid作为Firestore中的文档标题
1.在用户集合中创建一个包含用户详细信息的新文档。
因此,我尝试使用的代码如下(仅显示相关部分):
function App() {
const [user, setUser] = useState<object>({});
...
async function signUpUser(e: FormEvent) {
e.preventDefault();
...
try {
await createUserWithEmailAndPassword(auth, userEmail, userPassword);
const newUser = new User(userName, userEmail, userRole, []);
await setDoc(doc(db, "users", user.uid), {...newUser});
} catch(error) {
alert(error)
}
navigate("/location")
}
...
useEffect(() => {
onAuthStateChanged(auth, userData => {
const currentUser = userData as any
setUser(currentUser)
})
})
...
export default App;
但在类型检查后,出现了以下错误:“TS2339:类型'object'上不存在属性'uid'。”
我认为这是因为auth状态观察器还没有更新用户状态,我以为使用await会给予程序足够的时间来保存它,但事实并非如此。
如何修复代码,以便在数据库调用中立即使用用户uid?
我变了
const [user, setUser] = useState<object>({});
至
const [user, setUser] = useState<any>({});
这样就消除了Typecheck错误,但在调用signUpUser函数时,会抛出另一个关于空对象的错误。
我还尝试将signUpUser更改为一个同步函数,该函数在单独的异步函数中调用createUserWithEmailAndPassword和setDoc,但这会抛出相同的TS2339:类型'object'错误上不存在属性'uid'
我使用了一个不同的函数来获取当前登录用户的uid,如下所示:
const userID: string = auth.currentUser.uid
await setDoc(doc(db, "users", userID), {...newUser});
但这会产生以下错误:TS18047:“验证当前用户”可能为“null”。
1条答案
按热度按时间km0tfn4u1#
您需要从
createUserWithEmailAndPassword
捕获结果,您可以从createUserWithEmailAndPassword
获取UID。大概是这样的: