Proyecto local probado: n8n 2.44.5, 22 de octubre de 2026. Datos ficticios.

Un nodo rojo señala dónde se ha detenido una ejecución, pero la causa puede estar en sus datos de entrada. Este tutorial reproduce un problema pequeño: intentar limpiar un email que no existe. Después lo corregiremos conservando una señal que permita revisar el registro incompleto.

Dos proyectos para comparar

El ZIP incluye una versión que provoca el problema y otra que lo trata. Utiliza datos ficticios y ejecuciones manuales. Importa cada JSON en un workflow separado para poder comparar la entrada, la configuración y el resultado sin perder la versión inicial.

El primer proyecto contiene Ejecutar prueba, Entrada sin email y Normalizar sin comprobar. La entrada solo tiene nombre: Ana. El campo email no está presente. El segundo proyecto sustituye el último paso por Revisar email.

Workflow detenido en el nodo que intenta limpiar un email ausente.
Workflow detenido en el nodo que intenta limpiar un email ausente.

1. Ejecuta y lee el error

Abre el proyecto inicial y pulsa Execute workflow. Revisa el último nodo y su mensaje. No cambies varias opciones a la vez: primero identifica qué expresión intenta ejecutarse y sobre qué dato.

El nodo Code Normalizar sin comprobar intenta aplicar trim y toLowerCase a item.json.email. Esos métodos requieren un texto. Si email no existe, esa suposición no se cumple. En lugar de añadir reintentos, revisa la estructura que recibe el nodo: repetir la misma entrada incompleta no la corrige.

2. Compara entrada y expresión

Abre la entrada del último nodo y busca la propiedad email. Comprueba si se llama de otra forma, si está dentro de body o si falta por completo. En un Webhook, por ejemplo, el cuerpo recibido puede estar dentro de $json.body y no directamente en $json.email.

En la versión probada, una expresión similar dentro de Edit Fields puede terminar sin error de ejecución y devolver null. Por eso el ejemplo que se detiene utiliza Code: permite observar un error de JavaScript real. Un nodo verde con email vacío o null sigue necesitando revisión. Revisar la estructura evita soluciones que solo esconden el síntoma. Si el campo se ha perdido en un Edit Fields anterior, quizá debas conservarlo allí. Si el formulario nunca lo envió, la automatización necesita decidir qué hacer con ese registro.

3. Añade una comprobación de tipo

La versión corregida utiliza Edit Fields y comprueba typeof $json.email === «string» antes de limpiar el texto. Si es un texto, elimina espacios y lo pasa a minúsculas. Si no, devuelve un email vacío y el campo estado con el valor revisar_email.

Ese estado es importante: un nodo que termina sin error no demuestra que los datos estén completos. No estamos validando direcciones ni inventando un email. Estamos haciendo visible que el registro requiere otra decisión antes de continuar hacia una herramienta de destino.

4. Verifica dos situaciones

Con la entrada que solo contiene Ana, el resultado debe conservar nombre y mostrar estado revisar_email. Después añade email con espacios y mayúsculas, por ejemplo ANA@EXAMPLE.COM, y ejecuta otra vez: esperamos ana@example.com y estado listo.

Revisa siempre la última ejecución. Puedes tener abierta una salida anterior mientras has modificado la entrada. La comprobación útil consiste en relacionar el dato enviado, el recorrido ejecutado y el resultado, no en mirar únicamente el color del nodo.

Qué hacer con el registro incompleto

Puedes colocar un IF después de Revisar email para separar listo de revisar_email. Durante el aprendizaje basta con mostrar las dos salidas. No envíes automáticamente un mensaje a una dirección vacía ni guardes un registro incompleto como si fuera correcto.

La opción de continuar después de un error puede ser útil si diseñas qué ocurre con esa salida, pero activarla sin revisar el resultado no sustituye la validación. Lo mismo ocurre con los reintentos: tienen sentido ante ciertos fallos temporales, no ante un campo que falta siempre.

Un método de depuración reutilizable

Reduce el problema a una entrada pequeña, localiza el último nodo que recibió datos válidos, revisa los tipos y modifica una causa cada vez. Conserva un caso que fallaba y comprueba que sigue tratándose correctamente tras los cambios. Ese pequeño ensayo te servirá cuando el workflow tenga más nodos.

Fuente oficial: https://docs.n8n.io/flow-logic/error-handling/

Resultados comprobados

El proyecto inicial se detiene con un error al leer trim; la versión corregida devuelve estado revisar_email para el registro incompleto.

Error real de JavaScript al llamar a trim sobre un dato inexistente.
Error real de JavaScript al llamar a trim sobre un dato inexistente.
La versión corregida conserva a Ana y marca el registro como revisar_email.
La versión corregida conserva a Ana y marca el registro como revisar_email.

Descarga para practicar

Descargar proyecto en ZIP. Descomprime los archivos y revisa sus instrucciones antes de importarlos. No contienen credenciales ni la base de datos de la instalación.

Tutoriales relacionados

Importar y exportar workflows · Limpiar datos con Edit Fields · Practicar IF

Copia de seguridad de n8n con Docker en Windows: prueba también la restauración

Construye este workflow desde cero

Puedes crear los nodos manualmente en lugar de importar el ZIP. Los ajustes siguientes corresponden al archivo del proyecto y a la versión indicada al comienzo de la guía; los nombres de los controles pueden variar en otras versiones.

Ejecutar prueba · Manual Trigger

Añade Manual Trigger como inicio del flujo. Permite ejecutar la práctica pulsando Execute workflow, sin publicar un disparador automático.

Entrada sin email · Code

Añade Code, selecciona JavaScript y Run Once for All Items. Sustituye el código de ejemplo por:

return [{"nombre":"Ana"}].map(json => ({json}));

Revisar email · Edit Fields (Set)

Añade Edit Fields (Set) y selecciona Manual Mapping. Crea los siguientes campos; utiliza Fixed para valores literales y Expression para fórmulas. Conserva solo los campos configurados para reproducir la salida del proyecto.

CampoTipoModoValor
nombrestringExpression{{ $json.nombre }}
emailstringExpression{{ typeof $json.email === "string" ? $json.email.trim().toLowerCase() : "" }}
estadostringExpression{{ typeof $json.email === "string" && $json.email.trim().length > 0 ? "listo" : "revisar_email" }}

Las comillas de los valores de texto de la tabla indican que son cadenas: no las escribas en el campo Fixed. Conserva los espacios cuando formen parte de los datos de prueba.

Conecta los nodos y revisa el recorrido

  • Ejecutar prueba → Entrada sin email.
  • Entrada sin email → Revisar email.

Ejecuta desde el inicio y abre la salida de cada nodo. Comprueba los valores y el número de elementos antes de seguir. Un nodo verde indica ejecución completada, pero debes comparar su salida con los resultados esperados de esta guía.

Autor: Javier Fernández, estudiante. Conoce cómo documento las prácticas en Sobre n8nfácil o comunica un error indicando el paso y la versión.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *