He estado usando firebase (firestore) por un tiempo, pero estoy un poco atascado y me preguntaba si alguien puede pensar en una solución.
En Firestore DB tengo una sola colección de usuarios, cada usuario tiene una dirección de correo electrónico y varios otros campos. En este caso, estoy comprobando si existe un correo electrónico de usuario y, si existe, quiero crear un campo de lista para ese usuario en particular con un listUid. Estoy haciendo referencia a los usuarios por correo electrónico, tomando el docId para esos usuarios y luego tratando de establecer un campo de lista para cada uno de ellos.
No recibo ningún error de Firestore, simplemente no se actualiza en la base de datos por algún motivo y no puedo entender dónde me estoy equivocando. Gracias por adelantado
export const addListUidToExistingUserList = ( { firestore }, emailArray, listUid ) => { return async () => { let docIds = []; emailArray.forEach((emailAddress) => { //find users by email (works) const query = db .collection("users") .where("email", "==", emailAddress); //get docId's for user with matching email (works) query.get().then((querySnapshot) => { querySnapshot.forEach((doc) => { docIds.push(doc.id); }); }); //add a new list with corresponding listUid (does not work) docIds.forEach((id) => { let userRef = db.collection("users").doc(id); batch.set(userRef, { lists: [{ listUid }] }); }); }); return await batch.commit(); }; };Se encuentra con este problema porque su matriz docIds siempre está vacía en el momento en que llama a docIds.forEach .
Esto se debe a que query.get().then ejecuta de forma asincrónica, por lo que docIds.forEach no está esperando a que se complete.
Podrías:
await query.get().then ; odocIds.forEach DENTRO de la devolución de query.get thenAquí están sus posibles soluciones:
await query.get().then //get docId's for user with matching email (works) await query.get().then((querySnapshot) => { querySnapshot.forEach((doc) => { docIds.push(doc.id); }); });O:
docIds.forEach dentro then //get docId's for user with matching email (works) query.get().then((querySnapshot) => { querySnapshot.forEach((doc) => { docIds.push(doc.id); }); docIds.forEach((id) => { let userRef = db.collection("users").doc(id); batch.set(userRef, { lists: [{ listUid }] }); }); });Nota: Por supuesto, también puede agregar
batch.setdirectamente en su primera iteración dequerySnapshot.docs.forEachpara evitar una iteración innecesaria.