kb.erickguedes.com
N8N: Automação Low-Code

Condicoes e Transformacao de Dados

Aula 3 de 6

IF / Loop / Switch Nodes

Nodes de controle de fluxo permitem rotear dados baseado em condicoes.

echo "=== IF Node ==="
echo ""
echo "Funcao: Roteia dados baseado em condicao"
echo ""
echo "Configuracao:"
echo "  Condition: Value1 Operator Value2"
echo "  Operadores: =, !=, >, <, >=, <=, contains, startsWith"
echo ""
echo "Saidas:"
echo "  true (output 1) - dados que atendem condicao"
echo "  false (output 2) - dados que nao atendem"
echo "=== Switch Node ==="
echo ""
echo "Funcao: Roteia dados para multiplos caminhos"
echo ""
echo "Configuracao:"
echo "  Mode: Expression / Mapping"
echo "  Routing: Value -> Output N"
echo ""
echo "Exemplo: Prioridade de ticket"
echo "  'baixa' -> Output 1 (email auto)"
echo "  'media' -> Output 2 (notificar suporte)"
echo "  'alta' -> Output 3 (notificar supervisor)"
echo "  'critica' -> Output 4 (notificar diretor)"
echo "=== SplitInBatches ==="
echo ""
echo "Funcao: Processa dados em lotes"
echo ""
echo "Configuracao:"
echo "  Batch Size: numero de items por lote"
echo ""
echo "Uso tipico:"
echo "  - Processar 10k registros em lotes de 100"
echo "  - Evitar timeout em APIs externas"
echo "  - Respeitar rate limits"

Code Node (JavaScript/Python)

echo "=== Code Node ==="
echo ""
echo "Linguagens suportadas: JavaScript (padrao) e Python"
echo ""
echo "Estrutura do Item:"
echo "  item.json - dados estruturados (objeto)"
echo "  item.binary - dados binarios (imagens, PDFs)"
echo ""
echo "Entrada:"
echo "  $input.all() - todos os items do node anterior"
echo "  $input.first() - primeiro item apenas"
echo "  $input.item - item atual (em loop)"
echo ""
echo "Saida: Array de objetos com propriedade 'json'"
echo "=== Exemplos JavaScript ==="
echo ""

echo "Transformar dados:"
echo "return items.map(item => ({"
echo "  json: {"
echo "    nome: item.json.name.toUpperCase(),"
echo "    email: item.json.email.toLowerCase()"
echo "  }"
echo "}));"
echo ""

echo "Filtrar items:"
echo "return items.filter(item =>"
echo "  item.json.age >= 18"
echo ").map(item => ({ json: item.json }));"
echo ""

echo "Enriquecer com dados externos:"
echo "const response = await fetch('https://api.exemplo.com/dados');"
echo "const data = await response.json();"
echo "return items.map(item => ({"
echo "  json: { ...item.json, ...data }"
echo "}));"
echo "=== Exemplos Python ==="
echo ""
echo "from datetime import datetime"
echo ""
echo "result = []"
echo "for item in items:"
echo "    data = item['json']"
echo "    data['processed_at'] = datetime.now().isoformat()"
echo "    result.append({'json': data})"
echo ""
echo "return result"

Set Node

echo "=== Set Node ==="
echo ""
echo "Funcao: Adicionar, modificar ou remover campos"
echo ""
echo "Modos:"
echo "  - Manual Mapping: Definir campos manualmente"
echo "  - JSON to JSON: Transformar estrutura JSON"
echo "  - Raw: Expressao customizada"
echo ""
echo "Operacoes:"
echo "  - Set: Adicionar/substituir valor"
echo "  - Delete: Remover campo"
echo "  - Move: Mover campo de lugar"
echo ""
echo "Exemplo:"
echo "  Input: { name: \"Joao\", idade: 30 }"
echo "  Set: { status: \"ativo\" }"
echo "  Output: { name: \"Joao\", idade: 30, status: \"ativo\" }"

Item Lists

echo "=== Item Lists (Transform) ==="
echo ""
echo "Nodes uteis para processamento de listas:"
echo ""
echo "Aggregate: Agrupa items em um unico item"
echo "  Ex: [{a:1}, {a:2}] -> [{values: [{a:1}, {a:2}]}]"
echo ""
echo "Sort: Ordena items por campo"
echo "  Ex: Sort by 'name' ascending"
echo ""
echo "Limit: Limita numero de items"
echo "  Ex: Primeiros 10 items"
echo ""
echo "Remove Duplicates: Remove items duplicados"
echo "  Ex: Remove duplicados por 'email'"
echo ""
echo "Summarize: Agregacoes (sum, avg, count, min, max)"
echo "  Ex: Soma de 'valor' por 'categoria'"

Lab: Pipeline de Dados Condicional

cat > pipeline_condicional.sh << 'EOF'
echo "=== Lab: Pipeline de Processamento de Pedidos ==="

echo "Workflow: Processar Pedidos"
echo ""

echo "1. Trigger: Webhook POST /pedidos"
echo "   Body: { pedidos: [{ id,valor,pais }] }"
echo ""

echo "2. Code Node: Validar payload"
echo "   if (!body.pedidos) throw 'Payload invalido'"
echo "   return items"
echo ""

echo "3. IF Node: Valor > 1000?"
echo "   Verdadeiro -> Output 1 (prioritario)"
echo "   Falso -> Output 2 (normal)"
echo ""

echo "4. [Output 1] Slack Node: Notificar vendas"
echo "   'Pedido R\$ {valor} recebido - prioritario'"
echo ""

echo "5. [Output 2] Gmail Node: Email confirmacao"
echo "   'Pedido recebido em processamento'"
echo ""

echo "6. Set Node: Marcar status"
echo "   status = processado"
echo ""

echo "7. HTTP Request: Enviar para ERP"
echo "   POST https://api.erp.com/pedidos"
echo ""

echo "Flow completo:"
echo "  Webhook -> Code (valida) -> IF"
echo "    |-> (true) Slack ->"
echo "    |-> (false) Gmail ->"
echo "    Set -> HTTP Request -> Fim"
EOF

Dominar IF, Code e Set nodes significa dominar 80% dos casos de automacao. A logica condicional e o cerebro de qualquer workflow.