Ejecutar nodo de flujo de trabajo. La rama Success no se dispara hacia abajo a pesar de emitir datos; o ambas ramas se disparan simultáneamente con Always Output Data habilitado

Hola a todos - me encuentro con un problema persistente en el comportamiento de doble salida del nodo Execute Workflow cuando está configurado “On Error: Continue (using error output)”. Espero que alguien se haya topado con esto y haya encontrado un patrón limpio.

Configuración

  • Un flujo de trabajo padre llama a un subflujo mediante Execute Workflow.

  • Configuración del nodo Execute Workflow:

    • Modo: Ejecutar una vez por cada elemento

    • Esperar a que se complete el subflujo: ACTIVADO

    • On Error: Continue (using error output)

  • El nodo terminal del subflujo es una actualización de Google Sheets.

  • El padre tiene dos ramas descendentes: ruta de éxito (limpieza + alerta Telegram + página de finalización de formulario) y ruta de error (alerta de error Telegram + página de finalización de error).

El comportamiento que estoy viendo

Tengo dos modos de fallo dependiendo de la configuración Always Output Data en el nodo Execute Workflow del padre:

Caso A - Always Output Data DESACTIVADO en el nodo Execute Workflow del padre:

  • Cuando el subflujo tiene éxito: el nodo terminal (Sheets update) emite 1 elemento con los datos de fila completos. La pestaña Success Branch del nodo Execute Workflow del padre claramente muestra que el elemento está presente. Pero los nodos descendentes conectados al puerto de éxito no se ejecutan. La ejecución simplemente se detiene en Execute Workflow sin error ni enrutamiento adicional.

  • Cuando el subflujo falla: la rama de error se ejecuta correctamente con la carga útil del error. Limpio.

Caso B - Always Output Data ACTIVADO en el nodo Execute Workflow del padre:

  • Cuando el subflujo tiene éxito: ambas ramas, éxito y error, se ejecutan (éxito con los datos reales, pero también una ejecución fantasma de alguna manera).

  • Cuando el subflujo falla: ambas ramas se ejecutan simultáneamente: la rama de éxito se ejecuta con un elemento de marcador de posición vacío {}, la rama de error se ejecuta con la carga útil del error real. Ambas rutas descendentes se ejecutan en paralelo, lo que causa alertas Telegram duplicadas y páginas de finalización de formulario conflictivas.

Lo que he intentado

  1. Activar Always Output Data en el nodo terminal Sheets del subflujo ACTIVADO, con Always Output Data del Execute Workflow del padre DESACTIVADO. El nodo terminal del subflujo confirma que emite 1 elemento con datos completos cuando se verifica en el registro de subejecución. La pestaña Success Branch del Execute Workflow del padre también muestra ese elemento. Los nodos descendentes aún no se ejecutan.

  2. Verificar que Wait for Sub-Workflow Completion está ACTIVADO.

  3. Verificar el cableado en el lienzo - puerto de éxito al nodo de limpieza, puerto de error al nodo de alerta. Sin cambios accidentales.

  4. Probé ambos modos “Run once for each item” (Ejecutar una vez por cada elemento) y “Run once with all items” (Ejecutar una vez con todos los elementos). Mismo resultado.

  5. Redibujar las líneas de conector desde el puerto de éxito. Sin cambios.

Lo que quiero

El patrón estándar de doble salida que la mayoría de las personas parecen usar:

  • El subflujo tiene éxito → solo la rama de éxito se ejecuta descendentemente → se ejecutan limpieza + alerta de éxito.

  • El subflujo falla → solo la rama de error se ejecuta descendentemente → se ejecutan alerta de error + UI de recuperación.

  • Nunca ambas a la vez.

Preguntas

  1. ¿Es conocido que Continue (using error output) se comporta mal cuando el nodo terminal del subflujo devuelve elementos pero el puerto Execute Workflow del padre no se propaga a los nodos descendentes? ¿Hay una versión específica de n8n Cloud donde esto está parcheado?

  2. ¿Hay un patrón canónico que la gente usa para obtener un enrutamiento dual limpio - quizás con un nodo Merge, una verificación IF en $json.error, o algún workaround estructural que me esté perdiendo?

Cualquier indicación será apreciada. Estoy disponible para compartir más detalles de lo que más se necesitaría (como código JSON, capturas de pantalla del flujo de trabajo y otros).

Gracias.

1 me gusta

¡Bienvenido @Nick_Vieru a nuestra comunidad! Soy Jay y soy un creador verificado de n8n.

El comportamiento de rama dual con «Always Output Data» ACTIVADO es una peculiaridad conocida - mantenlo DESACTIVADO. El patrón más limpio: deja «On Error: Continue (using error output)» como está, y añade un nodo IF inmediatamente después del nodo Execute Workflow verificando {{ $json.error !== undefined }}. Los resultados exitosos del sub-workflow no llevarán un objeto de error; los resultados de error sí. Esto te da un ramificado explícito y limpio sin el problema de ejecución fantasma.

Una cosa que vale la pena revisar: asegúrate de que el nodo terminal de tu sub-workflow no esté accidentalmente ocultando el error antes de que llegue al padre - si el sub-workflow tiene su propio manejador de errores que captura y transforma el error en una salida normal, el nodo Execute Workflow del padre no lo verá como un error.

@Nick_Vieru
Comparte tu JSON por favor.

¡Hola Jay! ¡Muchas gracias por la respuesta rápida!

¡Voy a intentar lo que sugeriste y te digo si se resolvió el problema!

1 me gusta

¡Gracias Jay, funcionó! Tuve que hacer algunos ajustes en el workflow que se ejecutaba dentro del workflow que tenía problemas. Básicamente, había 2 nodos más que estaban en la posición terminal, y nunca llegaban a ellos porque también tenían un condicional, y para el escenario que estaba ejecutando, ese condicional nunca se activaba. Por lo tanto, el nodo terminal nunca se alcanzaba y la rama de éxito del execute workflow nunca podía activarse porque nunca recibía del workflow ejecutado confirmación de que había terminado exitosamente.

Metí el condicional IF dentro del workflow con el problema y añadí una rama del nodo condicional IF a una operación nula (en el workflow que fue invocado/ejecutado dentro), ¡y funciona!

1 me gusta

¡Me alegra que haya funcionado! Mover la condicional IF dentro del sub-workflow es en realidad un patrón más limpio de todas formas - mantiene la lógica de ramificación auto-contenida para que el elemento padre no necesite conocer la estructura interna de lo que está llamando.

2 Me gusta

¡Ya está arreglado, gracias!

¡De nada! Si ahora todo funciona como se esperaba, siéntete libre de marcar la respuesta correspondiente como la solución, ¡y que tengas un excelente día!

1 me gusta

Hola, soy nuevo en el foro. ¿Cómo puedo hacer eso?

1 me gusta

Ay, disculpa – acabo de darme cuenta de que este tema está en la categoría “Ayúdame a Construir mi Flujo de Trabajo”, no en “Preguntas”.
La función “Marcar como solución” solo está disponible en la categoría “Preguntas”, por eso no estás viendo la opción aquí.
¡Gracias de verdad por estar dispuesto a marcar una solución! Desafortunadamente esta categoría no admite esa función.