¿pre o post? Elegir el timing correcto de una función
Publicado 2 min de lecturaTambién en inglés
Las funciones de Groveback con trigger database tienen dos timings, y elegir mal se nota
como “¿por qué ctx es undefined?” o “¿por qué mi escritura es tan lenta?”.
pre: dentro de la escritura
Un hook pre corre de forma síncrona, dentro de la escritura. Puede rechazar el documento
o reescribirlo antes de guardarlo:
export default async (event) => {
if (!event.document.email?.includes('@')) {
return { abort: true, reason: 'email is invalid' };
}
return { document: { ...event.document, email: event.document.email.toLowerCase() } };
};
Úsalo para validación y normalización que deben cumplirse en toda escritura. Lo que no
recibe: ningún ctx, así que nada de ctx.db ni integraciones. Es una función pura del
documento entrante, a propósito: un hook que consultara la base a mitad de escritura haría
cada escritura tan lenta como su consulta más lenta.
Además tiene presupuesto ajustado: 2 s por hook (un timeoutMs mayor se recorta) y
5 s para toda la cadena de hooks pre de una escritura.
post: después de la escritura
post es el default. Corre de forma asíncrona, después de que la escritura se confirma,
desde una cola. Aquí van los efectos secundarios: mandar un email, llamar un webhook,
actualizar un agregado. Y aquí sí está ctx.db.
export default async (event, ctx) => {
const total = await ctx.db.count('orders', { ownerId: event.document.ownerId });
await ctx.db.upsertOne('stats', { id: event.document.ownerId }, { $set: { orders: total } });
};
Algo que recordar sobre ctx.db
ctx.db es un handle con service-role: corre por debajo del motor de políticas. Las
políticas de tu usuario final no aplican dentro de una función, así que la propia función es
responsable de tocar solo lo que debe. Las funciones corren en sandbox (el worker no tiene
cliente de Mongo ni secretos, y cada llamada pasa por el host), pero la decisión de
autorización es tuya.
Regla rápida
| Quieres… | Usa |
|---|---|
| Rechazar o transformar un documento antes de guardarlo | pre |
| Leer o escribir otras colecciones | post |
| Hablar con el mundo exterior | post |
Más en la guía de funciones.