Expression Node
O Expression Node não é um node tradicional, mas sim um sistema de expressões que permite usar código JavaScript inline em outros nodes do n8n. É fundamental para acessar dados dinâmicos e criar valores calculados.
Conceito Principal
Expression = "Código JavaScript Inline"
As expressões permitem:
- Acessar dados de outros nodes
- Calcular valores dinamicamente
- Transformar dados em tempo real
- Criar lógica condicional inline
💡 Dica: As expressões são usadas em campos de outros nodes, não como um node separado.
Sintaxe Básica
1. Estrutura das Expressões
{{ expressão JavaScript }}
2. Exemplos Simples
{{ $json.nome }} // Acessar campo 'nome'
{{ $json.preco * 1.1 }} // Calcular com 10% de acréscimo
{{ $json.ativo ? 'Sim' : 'Não' }} // Condicional ternário
{{ new Date().toISOString() }} // Data/hora atual
Variáveis Disponíveis
Acesso a Dados
// Dados do item atual
$json // Dados JSON do item atual
$binary // Dados binários (se houver)
// Dados de outros nodes
$('Nome do Node').json // Dados de um node específico
$('Node 1').json.campo // Campo específico de um node
// Contexto
$now // Data/hora atual
$today // Data atual
$workflow // Informações do workflow
$node // Informações do node atual
$position // Posição do item (0, 1, 2...)
$index // Índice do item (1, 2, 3...)
Exemplos de Uso
// Acessar dados do item atual
{{ $json.email }}
{{ $json.nome + ' ' + $json.sobrenome }}
// Acessar dados de outro node
{{ $('HTTP Request').json.results[0].name }}
// Usar contexto
{{ $now.toISOString() }}
{{ $workflow.name }}
Casos de Uso Práticos
1. HTTP Request - URL Dinâmica
Configuração:
Method: GET
URL: {{ 'https://api.exemplo.com/usuarios/' + $json.id }}
Exemplo com dados:
// Dados de entrada
{
"id": 123,
"nome": "João"
}
// URL resultante
https://api.exemplo.com/usuarios/123
2. Email - Assunto Dinâmico
Configuração:
To: {{ $json.email }}
Subject: {{ 'Pedido #' + $json.numero_pedido + ' - ' + $json.status }}
Body: |
Olá {{ $json.nome }},
Seu pedido #{{ $json.numero_pedido }} foi {{ $json.status }}.
Valor: R$ {{ $json.valor.toFixed(2) }}
Obrigado!
3. Set Node - Campos Calculados
Configuração:
Campo: nome_completo
Valor: {{ $json.primeiro_nome + ' ' + $json.ultimo_nome }}
Campo: idade
Valor: {{ Math.floor((new Date() - new Date($json.data_nascimento)) / (365.25 * 24 * 60 * 60 * 1000)) }}
Campo: categoria
Valor: {{ $json.valor > 1000 ? 'premium' : 'standard' }}
4. IF Node - Condições Dinâmicas
Configuração:
Condição: {{ $json.valor > 500 && $json.ativo }}
Exemplo com múltiplas condições:
{{
$json.valor > 1000 ? 'alta' :
$json.valor > 500 ? 'media' :
'baixa'
}}
5. Schedule Trigger - Horário Dinâmico
Configuração:
Cron Expression: {{ '0 ' + $json.hora + ' * * *' }}
Exemplo:
// Dados de entrada
{
"hora": 9,
"minuto": 30
}
// Cron resultante
0 9 * * *
Expressões Avançadas
Manipulação de Arrays
// Acessar primeiro elemento
{{ $json.produtos[0].nome }}
// Contar elementos
{{ $json.produtos.length }}
// Filtrar e mapear
{{ $json.produtos.filter(p => p.preco > 100).map(p => p.nome).join(', ') }}
// Somar valores
{{ $json.produtos.reduce((total, p) => total + p.preco, 0).toFixed(2) }}
Manipulação de Strings
// Capitalizar
{{ $json.nome.charAt(0).toUpperCase() + $json.nome.slice(1) }}
// Substituir caracteres
{{ $json.telefone.replace(/(\d{2})(\d{5})(\d{4})/, '($1) $2-$3') }}
// Extrair domínio
{{ $json.email.split('@')[1] }}
// Gerar slug
{{ $json.titulo.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '') }}
Cálculos Matemáticos
// Cálculo com desconto
{{ ($json.preco * (1 - $json.desconto / 100)).toFixed(2) }}
// Calcular impostos
{{ ($json.preco * 0.17).toFixed(2) }} // ICMS 17%
// Média de valores
{{ ($json.valor1 + $json.valor2 + $json.valor3) / 3 }}
// Porcentagem
{{ ((($json.atual - $json.anterior) / $json.anterior) * 100).toFixed(1) + '%' }}
Condicionais Complexas
// Múltiplas condições
{{
$json.idade < 18 ? 'menor' :
$json.idade < 25 ? 'jovem' :
$json.idade < 60 ? 'adulto' :
'idoso'
}}
// Validação múltipla
{{
$json.email && $json.telefone && $json.nome ? 'completo' : 'incompleto'
}}
// Status baseado em múltiplos critérios
{{
$json.ativo && $json.saldo > 0 && $json.ultimo_acesso ? 'ativo' : 'inativo'
}}
Formatação de Datas
// Data atual formatada
{{ new Date().toLocaleDateString('pt-BR') }}
// Data específica
{{ new Date($json.data_nascimento).toLocaleDateString('pt-BR') }}
// Data e hora
{{ new Date().toLocaleString('pt-BR') }}
// Timestamp
{{ new Date().getTime() }}
// Data relativa
{{
Math.floor((new Date() - new Date($json.data_criacao)) / (1000 * 60 * 60 * 24)) + ' dias atrás'
}}
Validações e Tratamento de Erros
Validação de Campos
// Verificar se campo existe
{{ $json.email ? $json.email : 'Email não informado' }}
// Valor padrão
{{ $json.categoria || 'geral' }}
// Validar formato de email
{{
/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test($json.email) ? 'válido' : 'inválido'
}}
// Validar CPF
{{
$json.cpf && $json.cpf.replace(/\D/g, '').length === 11 ? 'válido' : 'inválido'
}}
Tratamento de Erros
// Verificar se é número
{{
!isNaN($json.valor) ? parseFloat($json.valor).toFixed(2) : 'valor inválido'
}}
// Verificar se array existe
{{
Array.isArray($json.produtos) ? $json.produtos.length : 0
}}
// Verificar se objeto existe
{{
$json.endereco && $json.endereco.rua ? $json.endereco.rua : 'Endereço não informado'
}}
Exemplos por Node
HTTP Request Node
// URL dinâmica
{{ 'https://api.exemplo.com/' + $json.endpoint }}
// Headers dinâmicos
Authorization: {{ 'Bearer ' + $json.token }}
Content-Type: {{ $json.tipo || 'application/json' }}
// Body dinâmico
{{ JSON.stringify({
nome: $json.nome,
email: $json.email,
timestamp: new Date().toISOString()
}) }}
Email Node
// Assunto personalizado
{{ 'Notificação: ' + $json.tipo + ' - ' + $json.id }}
// Corpo do email
{{ `
Olá ${$json.nome},
Seu pedido #${$json.numero} foi ${$json.status}.
Detalhes:
- Produto: ${$json.produto}
- Valor: R$ ${$json.valor.toFixed(2)}
- Data: ${new Date($json.data).toLocaleDateString('pt-BR')}
Obrigado!
` }}
Set Node
// Campo calculado
nome_completo: {{ $json.primeiro_nome + ' ' + $json.ultimo_nome }}
// Campo com formatação
telefone_formatado: {{ $json.telefone.replace(/(\d{2})(\d{5})(\d{4})/, '($1) $2-$3') }}
// Campo com validação
status: {{ $json.ativo && $json.saldo > 0 ? 'ativo' : 'inativo' }}
// Campo com data
processado_em: {{ new Date().toISOString() }}
IF Node
// Condição simples
{{ $json.valor > 1000 }}
// Condição múltipla
{{ $json.ativo && $json.saldo > 0 && $json.ultimo_acesso }}
// Condição com validação
{{ $json.email && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test($json.email) }}
Limitações e Considerações
Limitações das Expressões:
- Escopo limitado: Apenas uma linha de código
- Sem loops: Não podem conter loops complexos
- Sem funções: Não podem definir funções
- Performance: Expressões complexas podem impactar performance
Boas Práticas:
// ✅ Bom: Expressão simples e clara
{{ $json.nome + ' ' + $json.sobrenome }}
// ✅ Bom: Validação com valor padrão
{{ $json.categoria || 'padrão' }}
// ❌ Evitar: Expressão muito complexa
{{ $json.produtos.filter(p => p.preco > 100).map(p => p.nome).join(', ') }}
// ❌ Evitar: Lógica complexa
{{ eval($json.expressao) }} // Perigoso!
Debugging:
// Usar console.log para debug (aparece nos logs do n8n)
{{ console.log('Dados:', $json) || $json.nome }}
// Verificar tipo de dados
{{ typeof $json.valor }}
// Verificar se campo existe
{{ $json.hasOwnProperty('campo') }}
Próximos Passos
Agora que você entende as expressões:
- Code Node - Para lógica complexa
- Function Node - Para funções simples
- Set Node - Para manipulação básica de dados
- IF Node - Para lógica condicional
Use expressões para valores dinâmicos simples e Function/Code Nodes para lógica complexa. As expressões são mais rápidas para operações básicas.
Expressões são executadas para cada item, então mantenha-as simples para melhor performance.
Evite usar
eval()
ou código dinâmico em expressões. Sempre valide dados de entrada.Links úteis:
- Documentação oficial das Expressões
- JavaScript MDN
- Code Node - Para lógica complexa
- Function Node - Para funções simples