← Notas

Cuando el status 200 engaña: detecta fallas ocultas en n8n

Aprende a identificar y solucionar errores silenciosos en automatizaciones.

Meme: un dev frente a monitores con un enredo caótico en pantalla mientras el status muestra 200

Un status 200 no significa que tu automatización funcionó. Significa que no explotó.

Es la distinción que más caro me ha costado aprender haciendo QA de workflows: un flujo puede devolver 200 en cada ejecución, verse sano en el dashboard y llevar semanas entregando basura en silencio. Nadie revisa lo que no falla.

La falsa seguridad del status 200

Cuando una automatización devuelve 200, asumimos que todo salió bien. Es el “todo OK” del protocolo HTTP. Pero ese código solo dice que la solicitud se recibió y se procesó sin errores técnicos. No garantiza que los datos devueltos sean correctos ni que la lógica de negocio se haya cumplido como esperabas. Ahí vive el bug silencioso: validar más allá de la superficie deja de ser opcional.

Más allá del código de respuesta

Confiar solo en el 200 es ciego al contenido de la respuesta. Tu workflow puede devolver un JSON con la estructura correcta pero con valores incorrectos o vacíos: un precio en cero, un campo que llegó null, una lista que debía traer 50 registros y trajo uno. Pasa por errores de lógica en el flujo, cambios en los datos de origen o una API externa que modificó su contrato sin avisar.

Contratos de datos: estableciendo expectativas claras

Para mitigar el riesgo de estos bugs silenciosos, es fundamental establecer contratos de datos. Un contrato de datos define claramente qué estructura y valores esperamos que devuelva nuestro workflow. Esto actúa como una guía tanto para la implementación como para la validación.

Definiendo un contrato de datos

Un contrato de datos debe especificar:

  • Estructura del objeto: Define los campos esperados, sus tipos de datos y si son obligatorios u opcionales.
  • Rangos y valores esperados: Para campos numéricos o fechas, define límites y formatos.
  • Patrones para cadenas de texto: Si un campo debe seguir un formato específico (como correos electrónicos), esto debe estar claramente definido.

Implementación en n8n

En n8n, podemos implementar contratos de datos utilizando nodos de función que validen la salida de otro nodo. Por ejemplo:

const expectedStructure = {
  id: 'number',
  name: 'string',
  email: 'string',
  isActive: 'boolean',
};

for (const item of items) {
  for (const key in expectedStructure) {
    if (typeof item.json[key] !== expectedStructure[key]) {
      throw new Error(`Invalid data type for ${key}: Expected ${expectedStructure[key]}, but got ${typeof item.json[key]}`);
    }
  }
}

Este fragmento de código verifica que cada elemento del flujo de datos cumpla con el contrato establecido.

Validación de esquema: asegurando consistencia

La validación de esquema es una técnica poderosa para asegurar que los datos cumplan con el formato esperado. Herramientas como ajv permiten definir esquemas JSON y validarlos de forma automática.

Ejemplo práctico

Supongamos que tenemos una API externa que devuelve datos de usuarios. Queremos asegurarnos de que cada respuesta cumpla con nuestro esquema esperado:

{
  "type": "object",
  "properties": {
    "id": { "type": "number" },
    "name": { "type": "string" },
    "email": { "type": "string", "format": "email" },
    "isActive": { "type": "boolean" }
  },
  "required": ["id", "name", "email"]
}

Podemos utilizar este esquema en n8n para validar los datos entrantes antes de que sean procesados por otros nodos.

Asserts y pruebas: garantías para tu lógica de negocio

Los asserts son una técnica comúnmente usada en programación para verificar que una condición se mantenga verdadera en tiempo de ejecución. En el contexto de n8n, podemos utilizar nodos de función para implementar estas comprobaciones.

Implementando asserts en n8n

Un ejemplo de assert en n8n podría ser:

if (!items.every(item => item.json.isActive === true)) {
  throw new Error('Not all users are active');
}

Este código asegura que todos los usuarios en el flujo de datos estén activos. Si no es así, se lanza un error, evitando que el workflow continúe con datos incorrectos.

Alertas tempranas: detectando problemas antes de que escalen

Detectar problemas temprano es crucial para mantener la integridad de nuestras automatizaciones. Las alertas tempranas pueden configurarse para notificar cuando algo no va según lo planeado.

Configuración de alertas en n8n

Podemos configurar nodos de correo, Slack o cualquier otro sistema de notificaciones para alertarnos cuando un assert falla o cuando la validación de esquema no se cumple. Esto garantiza que podamos intervenir rápidamente y corregir el problema antes de que afecte a otras partes del sistema.

Conclusión: acción concreta el lunes por la mañana

Para evitar que los bugs silenciosos te sorprendan, comienza el lunes por la mañana revisando tus workflows en n8n:

  1. Define contratos de datos claros para cada flujo crítico.
  2. Implementa validación de esquema utilizando herramientas como ajv.
  3. Añade asserts en puntos clave de tu lógica de negocio.
  4. Configura alertas tempranas para ser notificado de fallos potenciales.

Ninguna de las cuatro toma más de una tarde. La alternativa es enterarte del bug cuando lo reporta el cliente, y para entonces ya lleva semanas corriendo con un 200 verde.