Tengo usuarios siguiendo categorías. Si se agrega un nuevo producto a la base de datos, quiero que se agregue automáticamente a su lista de deseos a través de una función en la nube.
He estado luchando durante 2 días con eso y sin éxito :( El problema es con la búsqueda que devuelve un valor vacío. Entiendo por este hilo que tiene que ver con la espera asíncrona, pero no logré transformar mi función en consecuencia. (que tiene que ser v8 y no modular)
Gracias por su ayuda chicos!
Aquí está mi función:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); const db = admin.firestore(); exports.addProductToUserWhenCreated = functions.firestore.document('products/{documentUid}').onCreate((snap, context) => { // get the categories of the product (array of category iDs, noting that a product can be in different categories) let productCategories = snap.data().categories let productId = snap.id let categorySelectedBy // For each category, for (const category of productCategories) { // get the selectedBy field (array of userIds) => HERE IS THE ISSUE const snap = db.doc(`categories/${category}`).get() snap.then((doc) => { return categorySelectedBy = doc.data().selectedBy; }) // Add the productId to the user's selectedProducts (by creating a subcollection in the user's document) categorySelectedBy.map(user => { db.doc(`users/${user}/selectedProducts/${productId}`).set({ achievedRate: 0, }) }) } });Creo que estás bastante cerca. Debido a que usa un bucle for...of , en realidad puede usar await si marca toda la función de la nube como async :
// Add async here 👉 👇 exports.addProductToUserWhenCreated = functions.firestore.document('products/{documentUid}').onCreate(async (snap, context) => { // get the categories of the product (array of category iDs, noting that a product can be in different categories) let productCategories = snap.data().categories let productId = snap.id let categorySelectedBy // For each category, for (const category of productCategories) { // get the selectedBy field (array of userIds) // await here 👇 const doc = await db.doc(`categories/${category}`).get() const categorySelectedBy = doc.data().selectedBy; // Add the productId to the user's selectedProducts (by creating a subcollection in the user's document) // 👇 Use Promise.all to wait for all writes here Promise.all(categorySelectedBy.map(user => { return db.doc(`users/${user}/selectedProducts/${productId}`).set({ achievedRate: 0, }) })) } });