Estoy tratando de actualizar el documento de Firestore de un usuario desde una función de Firebase mediante una consulta y tengo problemas para que funcione. Mi código de función es el siguiente:
const functions = require('firebase-functions'); // The Firebase Admin SDK to access Firestore. const admin = require('firebase-admin'); admin.initializeApp(); /** * A webhook handler function for the relevant Stripe events. */ // Here would be the function that calls updatePlan and passes it the customer email, // I've omitted it to simplify the snippet const updatePlan = async (customerEmail) => { await admin.firestore() .collection('users').where('email', '==', customerEmail).get() .then((doc) => { const ref = doc.ref; ref.update({ 'purchasedTemplateOne': true }); }); };Recibo el siguiente error en los registros de Firebase cuando se ejecuta la consulta:
Excepción de una función finalizada: TypeError: no se pueden leer las propiedades de undefined (leyendo 'actualizar')
Cualquier ayuda con respecto a lo que puedo estar haciendo mal o sugerencias sobre cómo podría lograr esto sería muy apreciada. ¡Gracias de antemano!
Actualizar:
Pude resolver mi problema con una mayor comprensión de las consultas de Firestore:
const updatePlan = (customerEmail) => { const customerQuery = admin.firestore().collection("users").where("email", "==", customerEmail) customerQuery.get().then(querySnapshot => { if (!querySnapshot.empty) { // Get just the one customer/user document const snapshot = querySnapshot.docs[0] // Reference of customer/user doc const documentRef = snapshot.ref documentRef.update({ 'purchasedTemplateOne': true }) functions.logger.log("User Document Updated:", documentRef); } else { functions.logger.log("User Document Does Not Exist"); } }) };El mensaje de error le dice que doc.ref no está definido. No hay ref de propiedad en el objeto doc .
Esto probablemente se deba a que no entendió bien el objeto que resulta de una consulta de Firestore. Incluso si espera un solo documento, una consulta filtrada puede devolver cero o más documentos. Esos documentos siempre se representan en un objeto de tipo QuerySnapshot . Eso es lo que realmente es doc , una QuerySnapshot, por lo que debe tratarlo como tal.
Tal vez debería verificar el tamaño del conjunto de resultados antes de acceder a la matriz de documentos para ver qué devuelve la consulta. Esto está cubierto en la documentación .