Hola , estoy tratando de cargar archivos ( .csv, .xlsx de 5000 filas y 6 columnas) a firebase con funciones en la nube a las que llamo desde la interfaz, la función en la nube se inicia y después de unos segundos de ejecución, se produce un error " code":"4" "detalles":"Fecha límite excedida"
(Plan de fuego)
explicación del código a continuación:
Hago un bucle for of que itera sobre una matriz de matrices que se ve así [['Dufour', 'Annie', 'annie.duf@gmail.com', 33683333005, 'f'], ['john',' Doe', 'john@gmail.com', 33223424, 'm']] luego formateo cada fila para estructurarla como un documento de firestore con muchos campos e intento agregarlo a firestore, luego se bloquea, no puedo averiguar cuándo se bloquea, es realmente aleatorio y cuando intento un archivo más pequeño (1000 filas) también se bloquea después de unos segundos de ejecución
export const createNewLeads = functions.region("europe-west3").https.onCall(async (data, context) => { if (!context.auth) { throw new functions.https.HttpsError('failed-precondition', 'The function must be called' + 'while authenticated.'); } const { category, subcategory, allLeads, downloadUrl, file_id, fileDetails } = data; for (const lead of allLeads) { const leads_infos = format_lead_infos(lead , fileDetails); const leads_meta = format_lead_metadata(downloadUrl, file_id, fileDetails); const db_lead_ref = admin.firestore().collection('leads'); const new_lead_doc_id = db_lead_ref.doc().id; db_lead_ref .doc(new_lead_doc_id).set({ lead_id: new_lead_doc_id, category: category, subcategory: subcategory, createdOn: Date(), uploaded_by: context.auth.uid, purchased_by: null, metadata: leads_meta, infos: leads_infos }).then(() => { functions.logger.info('createLeads SUCCESS', { docId: new_lead_doc_id }); return { user_id: new_lead_doc_id, created: true, }; }).catch((error: any) => { functions.logger.info('createLeads ERROR', { error }); return { error: true, err_mess: error, }; }); } });Por lo que puedo ver, no está manejando correctamente la naturaleza asíncrona de escribir en Firestore, ya que no está await la llamada a set() . También está devolviendo un resultado en la primera escritura exitosa del documento en el bucle, lo que parece sospechoso.
Esto debería estar más cerca de lo que necesitas:
try { for (const lead of allLeads) { const leads_infos = format_lead_infos(lead , fileDetails); const leads_meta = format_lead_metadata(downloadUrl, file_id, fileDetails); const db_lead_ref = admin.firestore().collection('leads'); const new_lead_doc_id = db_lead_ref.doc().id; await db_lead_ref.doc(new_lead_doc_id).set({ lead_id: new_lead_doc_id, category: category, subcategory: subcategory, createdOn: Date(), uploaded_by: context.auth.uid, purchased_by: null, metadata: leads_meta, infos: leads_infos }); } } catch (error: any) => { functions.logger.info('createLeads ERROR', { error }); return { error: true, err_mess: error, }; } functions.logger.info('createLeads SUCCESS', { docId: new_lead_doc_id return { user_id: new_lead_doc_id, created: true, }; En este código, await cada operación de escritura del documento y luego devolvemos un error si alguno de ellos falla, y el éxito solo una vez que todos tienen éxito.
Hola, Frank, gracias por ayudarnos, copié el código que nos diste, pero después de unos segundos de ejecución, recibí este error del código del registro de la consola de Firebase.
export const createNewLeads = functions.region("europe-west3").https.onCall(async (data, context) => { if (!context.auth) { throw new functions.https.HttpsError('failed-precondition', 'The function must be called' + 'while authentificated.'); } const { category, subcategory, allLeads, downloadUrl, file_id, fileDetails } = data; const db_lead_ref = admin.firestore().collection('leads'); const new_lead_doc_id = db_lead_ref.doc().id; try { for (const lead of allLeads) { const leads_infos = format_lead_infos(lead , fileDetails); const leads_meta = format_lead_metadata(downloadUrl, file_id, fileDetails); await db_lead_ref.doc(new_lead_doc_id).set({ lead_id: new_lead_doc_id, category: category, subcategory: subcategory, createdOn: Date(), uploaded_by: context.auth.uid, purchased_by: null, metadata: leads_meta, infos: leads_infos }); } } catch (error:any) { functions.logger.info('createLeads ERROR', { error }); return { error: true, err_mess: error, } } functions.logger.info('createLeads SUCCESS', { docId: new_lead_doc_id }) return { user_id: new_lead_doc_id, created: true, } });