Funciones en la nube
const nuevosdatos = valor.datos(); //<<< modificación de campo
Código:
exports.productCopy = functions.https.onCall( async (data, context)=>{ const uid = context.auth.uid; data.selectedProductId.forEach((docId){ const productRef = admin.firestore() .collection('products') .doc(docId); const newProductRef = admin.firestore() .collection('products') .doc(); const product = await productRef.get().then((value)=>{ const newData = value.data(); newProductRef.add(value.data()) }); }); return {status:'success', isError: false}; });
Primero, es bueno saber que cada documento es inmutable, después de obtener un documento en una variable, puede modificar esa variable y luego deberá colocar/actualizar/parchar el nuevo documento.
Quise decir que necesita hacer 2 llamadas a la API para guardar correctamente el documento en su base de datos.
Realmente no puedes usar await
en el bloque forEach
. Si desea esperar varias acciones, use Promise.all()
.
Debería ser algo como esto:
exports.productCopy = functions.https.onCall((data, context) => { const uid = context.auth.uid; const promises = data.selectedProductId.map((docId) => { return admin.firestore() // 👈 Return promise, which bubbles up .collection('products') .doc() // 👈 You need to specify a document ID here, uid maybe? .get() .then((doc) => { const newData = doc.data(); return admin.firestore() // 👈 Return promise, which bubbles up .collection('products') .doc(docId) .add(value.data()); }); }); return Promise.all(promises).then((results) => { // 👈 Wait for all promises to resolve return { status:'success', isError: false }; }) });
En general, es mejor no mezclar async
/ await
con then()
, ya que es fácil meterse en situaciones como las que tenía. Aquí, solo usando promesas, mantenga el código lo más simple posible