reactjs Firebase:如何创建用户,然后在Firestore数据库中使用用户ID?

tvmytwxo  于 2022-12-12  发布在  React
关注(0)|答案(1)|浏览(111)

我正在用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”。

km0tfn4u

km0tfn4u1#

您需要从createUserWithEmailAndPassword捕获结果,您可以从createUserWithEmailAndPassword获取UID。
大概是这样的:

const credentials = await createUserWithEmailAndPassword(auth, userEmail, userPassword);
const newUser = new User(userName, userEmail, userRole, []);
await setDoc(doc(db, "users", credentials.user.uid), {...newUser});

相关问题