代码之家  ›  专栏  ›  技术社区  ›  Diego Maquill

React:尝试使用firebase.auth uid[重复]创建自定义firebase-db.collection

  •  0
  • Diego Maquill  · 技术社区  · 2 年前

    我无法将uid传递给我的db.collection(“”)函数。 我做错了什么? 这是我的注册组件

    import React, {useRef, useState} from 'react';
    import Grid from "@material-ui/core/Grid";
    import SimpleReactValidator from "simple-react-validator";
    import {toast} from "react-toastify";
    import TextField from "@material-ui/core/TextField";
    import Button from "@material-ui/core/Button";
    import {Link, useNavigate} from "react-router-dom";
    import { useAuth } from '../../context/AuthContext';
    import { db } from '../../firebase/firebase';
    import './style.scss';
    
    const SignUpPage = (props) => {
    
        const { signUp, currentUser } = useAuth();    
        const push = useNavigate();
        //const passwordConfirmRef = useRef()
        const [error, setError] = useState('');
        const [buttonVisibility, setButtonVisibility] = useState(false);
        const [value, setValue] = useState({});
    
        const submitForm = async (e) => {
            e.preventDefault();
            passwordMatch();
            /*if (validator.allValid()) {
                setValue({
                    email: '',
                    full_name: '',
                    password: '',
                    confirm_password: '',
                });*/
                //validator.hideMessages();
                //success
                try{
                    if (textValidator.allValid()) {               
                    setError('');
                    setButtonVisibility(true);
                    console.log('passed email ' + value.email + 'passed password ' + value.password)
                    let specialuuId = await signUp(value.email, value.password);
                    console.log('auth created');                
                    console.log('SignUp currentUser.uid#### ' + specialuuId);                
                    await db.collection('usersCollection').document(specialuuId).setData({
                        email: value.email,
                        firstName: value.first_name,
                        lastName: value.last_name
                    });
                    console.log('db linked');
                    setValue({
                        first_name: '',
                        last_name_name: '',
                        email: '',
                        password: '',
                        confirm_password: '',
                    });
                    toast.success('Registration Complete successfully!');             
                    push('/login');           
                    }
                    } catch {
                        toast.error('Failed to create an account');               
                }
                setButtonVisibility(false);
            };
    

    这是我的AuthContext cmp

    import { useEffect, useState, createContext, useContext } from "react";
    import   { auth } from '../firebase/firebase';
    
    const formatAuthUser = (user) => ({
        uid: user.uid,
        email: user.email,
        displayName: user.displayName
      });
    
    const AuthContext = createContext({
        authUser: null,
        loading: true,
        signUp: async () => {}
    }) 
    
    export const useAuth = () => useContext(AuthContext);
    
    export function AuthProvider({children}) {
    
        const [currentUser, setCurrentUser] = useState();
        const [loading, setLoading] = useState(true);
        //const [userId, setUserId] = useState('');
    
        const authStateChanged = async (authState) => {
            if (!authState) {
                setCurrentUser(null);
                setLoading(false);
                return;
                }
            setLoading(true)
            var formattedUser = formatAuthUser(authState);
            setCurrentUser(formattedUser);    
            setLoading(false);
          };
    
        const signUp = async (email, password) => {
            let uuid;
            await auth.createUserWithEmailAndPassword(email, password)
            .then((user) =>{
            uuid = user.user.uid;
            console.log('uudi#### ' + uuid);
            return uuid;
            })
        }
    
        const signIn = (email, password) => {
            return auth.signInWithEmailAndPassword(email, password)
        }
    
        const signOut = () => {
            return auth.signOut();
        }
        
        useEffect(()=>{
            const unsubscribe = auth.onAuthStateChanged(authStateChanged)
            return unsubscribe;
        },[]);
    
        const value = {
            currentUser,
            loading,
            signIn,
            signUp,
            signOut,
        }
    
        return (
            <AuthContext.Provider value={value}>
                {!loading && children}
            </AuthContext.Provider>
        )
    }
    

    我看到我的uuid是在AuthContext cmp中建立的,但它从未返回到signUp cmp 它在console.log中显示为未定义 enter image description here

    我原以为consolo.log会在这里显示uuid

    let specialuuId = await signUp(value.email, value.password);
    console.log('auth created');                
    console.log('SignUp currentUser.uid#### ' + specialuuId);      
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Doug Stevenson    2 年前

    signUp函数总是返回undefined。在这里,它的格式更正确:

    const signUp = async (email, password) => {
        let uuid;
        await auth.createUserWithEmailAndPassword(email, password)
            .then((user) =>{
                uuid = user.user.uid;
                console.log('uudi#### ' + uuid);
                return uuid;
            })
    
    

    那个 return 在回调中没有从signUp返回。它只是从您传递给的回调函数返回 then 除此之外。没有返回任何值 signUp ,这就是为什么你总是得不到定义。

    由于您使用的是async/await,因此不需要使用 然后 完全事实上,将then与async/await混合使用几乎总是一个编程错误。请改为执行以下操作:

    const signUp = async (email, password) => {
        const user = await auth.createUserWithEmailAndPassword(email, password)
        const uuid = user.user.uid;
        console.log('uudi#### ' + uuid);
        return uuid;
    }