Tengo a continuación un método que registra a un usuario con su correo electrónico y contraseña y crea un documento en Firebase cuando el usuario ingresa su información en un formulario y hace clic en enviar:
const onSubmitHandler = async (e) => { e.preventDefault(); try { const { user } = await createAuthUserWithEmailAndPassword(email, password); console.log(user, 'user') await createUserDocumentFromAuth(user, { displayName }) }catch(err) { if(err === 'auth/email-already-in-use') { alert('Account with this email already exists'); return; }else { console.log(err) } } }Para esta función llama:
await createUserDocumentFromAuth(user, { displayName }) donde displayName puede ser una cadena, como ElonMusk . En el createUserDocumentFromAuth real, llamo al método setDoc, que es uno de Firebase para establecer un documento de usuario:
export const createUserDocumentFromAuth = async ( userAuth, additionalInfo = {} ) => { if(!userAuth) return; console.log(additionalInfo, 'additionalInfo') const userDocRef = doc(db, 'users', userAuth.uid); const userSnapshot = await getDoc(userDocRef); if(!userSnapshot.exists()) { const { displayName, email } = userAuth; const createdAt = new Date(); try { // set the doc here await setDoc(userDocRef, { displayName, email, createdAt, ...additionalInfo }); } catch(err) { console.log('err creating the user', err) } }; return userDocRef; } La razón por la que pasé { displayName } manualmente es porque hay un caso en el que la respuesta del servidor a createAuthUserWithEmailAndPassword(email, password) tiene displayName null , pero queremos que el usuario tenga un displayName registrado en la base de datos.
Mi pregunta es:
displayName solo funciona cuando se pasa como un objeto y no solo en su forma normal? Por ejemplo: await createUserDocumentFromAuth(user, { displayName }) reemplazará el displayName: null Pero no cuando paso:
await createUserDocumentFromAuth(user, displayName)Si observa createUserDocumentFromAuth , verá que espera dos argumentos userAuth e additionalInfo , se espera que ambos argumentos sean objetos.
Luego usa datos de AdditionalInfo para additionalInfo /sobrescribir cualquier cosa en userAuth cuando llama al método setDoc() .
Entonces, recomendaría agregar
console.log(userDocRef, { displayName, email, createdAt, ...additionalInfo }); para ver qué datos se envían a setDoc()