Estoy tratando de usar un convertidor de datos de Firestore dentro de una transacción en la que agrego un registro a una colección ( entries
) y actualizo un contador en otra colección ( users
). Sin embargo, no puedo entender cómo usar el convertidor dentro de una transacción y no he podido encontrar ningún ejemplo. Si bien los documentos de Firebase suelen ser excelentes, parecen quedarse cortos con respecto a las transacciones.
// Add new entry and increment user entry counter
async addEntry(entry: Entry): Promise<void> {
const entryRef = db.collection("entries").doc(entry.id);
const userRef = db.collection("user").doc(entry.userId);
await db.runTransaction(async (transaction) => {
// NOTE: Cannot use converter with transaction???
await transaction.set(entryRef, entry).withConverter(entryConverter);
// QUESTION: Is this a proper use of "increment" (ie. inside a transaction)?
await transaction.update(userRef, { entries: FieldValue.increment(1) });
});
}
Así es como se vería sin la transacción y usando un convertidor (pero necesito la transacción).
await db.collection("entries")
.doc(entry.id)
.withConverter(entryConverter)
.set(entry);
await db.collection("users")
.doc(entry.userId)
.update({ entries: FieldValue.increment(1) });
¿Cómo puedo realizar de manera segura estas dos operaciones en una transacción mientras uso un convertidor para los nuevos datos?
Solución del problema
De hecho, esto no está documentado, pero puede configurar el convertidor fuera de la transacción y antes de especificar un documento, ya que el convertidor se está aplicando a la colección y debería funcionar. Entonces algo como:
async addEntry(entry: Entry): Promise<void> {
const entryRef = db.collection("entries").withConverter(entryConverter).doc(entry.id);
const userRef = db.collection("user").doc(entry.userId);
await db.runTransaction(async (transaction) => {
await transaction.set(entryRef, entry);
await transaction.update(userRef, { entries: FieldValue.increment(1) });
});
}
No hay comentarios.:
Publicar un comentario