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.
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.
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
// 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
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
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!
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'}}
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'
}}
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!
Debug
// 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