Set Node
O Set Node é um dos nodes mais versáteis do n8n para manipulação de dados. Ele permite adicionar, modificar ou remover campos dos dados que fluem através do workflow.
O que é o Set Node?
O Set Node permite:
- Adicionar novos campos aos dados
- Modificar valores de campos existentes
- Remover campos desnecessários
- Renomear campos para melhor organização
- Calcular valores baseados em outros campos
- Formatar dados para uso posterior
Quando Usar o Set Node
- Transformação básica de dados
- Adição de metadados (timestamps, IDs)
- Formatação de campos (datas, números)
- Cálculos simples (somas, médias)
- Limpeza de dados (remoção de campos)
- Padronização de estruturas de dados
Configuração Básica
Estrutura do Set Node
// Set Node - Estrutura básica
{
"mode": "keepOnlySet", // ou "keepAllSet", "keepOnlySet", "keepAllExceptSet"
"values": {
"string": [
{
"name": "novo_campo",
"value": "valor_do_campo"
}
],
"number": [
{
"name": "quantidade",
"value": 10
}
],
"boolean": [
{
"name": "ativo",
"value": true
}
]
}
}
Modos de Operação
1. Keep All Set
- Mantém todos os campos existentes
- Adiciona novos campos especificados
- Modifica campos existentes se especificados
2. Keep Only Set
- Remove todos os campos existentes
- Mantém apenas os campos especificados
- Adiciona novos campos especificados
3. Keep All Except Set
- Mantém todos os campos existentes
- Remove apenas os campos especificados
- Adiciona novos campos especificados
Tipos de Valores
1. String
// Adicionar campo de texto
{
"name": "status",
"value": "ativo"
}
// Usar expressão
{
"name": "nome_completo",
"value": "{{ $json.nome + ' ' + $json.sobrenome }}"
}
// Formatação de texto
{
"name": "email_formatado",
"value": "{{ $json.email.toLowerCase() }}"
}
2. Number
// Adicionar número fixo
{
"name": "quantidade",
"value": 100
}
// Cálculo simples
{
"name": "total",
"value": "{{ $json.preco * $json.quantidade }}"
}
// Cálculo com desconto
{
"name": "valor_final",
"value": "{{ $json.valor * (1 - $json.desconto / 100) }}"
}
3. Boolean
// Valor booleano fixo
{
"name": "processado",
"value": true
}
// Condição booleana
{
"name": "premium",
"value": "{{ $json.valor > 1000 }}"
}
// Validação
{
"name": "valido",
"value": "{{ $json.email && $json.nome }}"
}
4. Object
// Objeto simples
{
"name": "endereco",
"value": {
"rua": "Rua das Flores",
"numero": 123,
"cidade": "São Paulo"
}
}
// Objeto com expressões
{
"name": "dados_completos",
"value": {
"nome": "{{ $json.nome }}",
"email": "{{ $json.email }}",
"idade": "{{ $json.idade }}",
"timestamp": "{{ $now.toISOString() }}"
}
}
5. Array
// Array simples
{
"name": "tags",
"value": ["urgente", "importante", "cliente"]
}
// Array com expressões
{
"name": "categorias",
"value": "{{ $json.tags.map(tag => tag.toUpperCase()) }}"
}
// Array filtrado
{
"name": "produtos_ativos",
"value": "{{ $json.produtos.filter(p => p.ativo) }}"
}
Exemplos Práticos
1. Adicionar Metadados
// Set Node - Adicionar metadados
{
"mode": "keepAllSet",
"values": {
"string": [
{
"name": "workflow_id",
"value": "{{ $workflow.id }}"
},
{
"name": "node_name",
"value": "{{ $node.name }}"
}
],
"number": [
{
"name": "timestamp",
"value": "{{ $now.toMillis() }}"
}
],
"string": [
{
"name": "data_processamento",
"value": "{{ $now.toFormat('dd/MM/yyyy HH:mm:ss') }}"
}
]
}
}
2. Formatação de Dados
// Set Node - Formatação de dados
{
"mode": "keepAllSet",
"values": {
"string": [
{
"name": "nome_formatado",
"value": "{{ $json.nome.charAt(0).toUpperCase() + $json.nome.slice(1).toLowerCase() }}"
},
{
"name": "telefone_formatado",
"value": "{{ $json.telefone.replace(/(\d{2})(\d{5})(\d{4})/, '($1) $2-$3') }}"
},
{
"name": "cpf_formatado",
"value": "{{ $json.cpf.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4') }}"
}
]
}
}
3. Cálculos Financeiros
// Set Node - Cálculos financeiros
{
"mode": "keepAllSet",
"values": {
"number": [
{
"name": "subtotal",
"value": "{{ $json.preco * $json.quantidade }}"
},
{
"name": "desconto_valor",
"value": "{{ ($json.preco * $json.quantidade) * ($json.desconto / 100) }}"
},
{
"name": "total",
"value": "{{ ($json.preco * $json.quantidade) * (1 - $json.desconto / 100) }}"
},
{
"name": "valor_parcela",
"value": "{{ (($json.preco * $json.quantidade) * (1 - $json.desconto / 100)) / $json.num_parcelas }}"
}
]
}
}
4. Validação e Classificação
// Set Node - Validação e classificação
{
"mode": "keepAllSet",
"values": {
"boolean": [
{
"name": "dados_completos",
"value": "{{ $json.nome && $json.email && $json.telefone }}"
},
{
"name": "email_valido",
"value": "{{ /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test($json.email) }}"
},
{
"name": "maior_idade",
"value": "{{ $json.idade >= 18 }}"
}
],
"string": [
{
"name": "categoria_cliente",
"value": "{{ $json.valor_total > 10000 ? 'Premium' : $json.valor_total > 5000 ? 'Gold' : 'Standard' }}"
},
{
"name": "prioridade",
"value": "{{ $json.urgente ? 'Alta' : $json.valor_total > 1000 ? 'Média' : 'Baixa' }}"
}
]
}
}
5. Limpeza de Dados
// Set Node - Limpeza de dados
{
"mode": "keepOnlySet",
"values": {
"string": [
{
"name": "nome",
"value": "{{ $json.nome.trim() }}"
},
{
"name": "email",
"value": "{{ $json.email.toLowerCase().trim() }}"
},
{
"name": "telefone",
"value": "{{ $json.telefone.replace(/\D/g, '') }}"
}
],
"number": [
{
"name": "idade",
"value": "{{ parseInt($json.idade) || 0 }}"
},
{
"name": "valor",
"value": "{{ parseFloat($json.valor) || 0 }}"
}
],
"string": [
{
"name": "data_processamento",
"value": "{{ $now.toISOString() }}"
}
]
}
}
6. Agregação de Dados
// Set Node - Agregação de dados
{
"mode": "keepAllSet",
"values": {
"number": [
{
"name": "total_itens",
"value": "{{ $json.itens.length }}"
},
{
"name": "valor_total",
"value": "{{ $json.itens.reduce((sum, item) => sum + item.valor, 0) }}"
},
{
"name": "media_valor",
"value": "{{ $json.itens.reduce((sum, item) => sum + item.valor, 0) / $json.itens.length }}"
}
],
"string": [
{
"name": "categorias",
"value": "{{ [...new Set($json.itens.map(item => item.categoria))].join(', ') }}"
}
]
}
}
Casos de Uso Avançados
1. Transformação de Estrutura
// Set Node - Transformar estrutura de dados
{
"mode": "keepOnlySet",
"values": {
"object": [
{
"name": "cliente",
"value": {
"id": "{{ $json.id }}",
"nome": "{{ $json.nome }}",
"email": "{{ $json.email }}",
"telefone": "{{ $json.telefone }}"
}
},
{
"name": "pedido",
"value": {
"numero": "{{ $json.numero_pedido }}",
"data": "{{ $json.data_pedido }}",
"valor": "{{ $json.valor_total }}",
"status": "{{ $json.status }}"
}
},
{
"name": "metadata",
"value": {
"processado_em": "{{ $now.toISOString() }}",
"workflow": "{{ $workflow.name }}",
"versao": "1.0"
}
}
]
}
}
2. Condicionais Avançadas
// Set Node - Condicionais avançadas
{
"mode": "keepAllSet",
"values": {
"string": [
{
"name": "status_processamento",
"value": "{{ $json.erro ? 'Falha' : $json.pendente ? 'Pendente' : 'Sucesso' }}"
},
{
"name": "mensagem",
"value": "{{ $json.erro ? 'Erro: ' + $json.erro : $json.pendente ? 'Aguardando aprovação' : 'Processado com sucesso' }}"
}
],
"number": [
{
"name": "prioridade",
"value": "{{ $json.urgente ? 1 : $json.importante ? 2 : 3 }}"
}
],
"boolean": [
{
"name": "requer_aprovacao",
"value": "{{ $json.valor > 5000 || $json.categoria === 'financeiro' }}"
}
]
}
}
3. Manipulação de Arrays
// Set Node - Manipulação de arrays
{
"mode": "keepAllSet",
"values": {
"array": [
{
"name": "produtos_ativos",
"value": "{{ $json.produtos.filter(p => p.ativo) }}"
},
{
"name": "categorias_unicas",
"value": "{{ [...new Set($json.produtos.map(p => p.categoria))] }}"
},
{
"name": "produtos_premium",
"value": "{{ $json.produtos.filter(p => p.valor > 100).map(p => ({ ...p, categoria: 'Premium' })) }}"
}
],
"number": [
{
"name": "total_produtos",
"value": "{{ $json.produtos.length }}"
},
{
"name": "produtos_ativos_count",
"value": "{{ $json.produtos.filter(p => p.ativo).length }}"
}
]
}
}
Boas Práticas
1. Nomenclatura de Campos
// ✅ Bom: Nomes descritivos
{
"name": "data_processamento",
"value": "{{ $now.toISOString() }}"
}
// ❌ Evitar: Nomes genéricos
{
"name": "data",
"value": "{{ $now.toISOString() }}"
}
2. Validação de Dados
// ✅ Bom: Validar antes de usar
{
"name": "valor_formatado",
"value": "{{ $json.valor ? parseFloat($json.valor).toFixed(2) : '0.00' }}"
}
// ❌ Evitar: Usar sem validação
{
"name": "valor_formatado",
"value": "{{ parseFloat($json.valor).toFixed(2) }}"
}
3. Organização de Campos
// ✅ Bom: Agrupar campos relacionados
{
"mode": "keepAllSet",
"values": {
"string": [
{ "name": "nome", "value": "{{ $json.nome }}" },
{ "name": "email", "value": "{{ $json.email }}" },
{ "name": "telefone", "value": "{{ $json.telefone }}" }
],
"number": [
{ "name": "idade", "value": "{{ $json.idade }}" },
{ "name": "valor", "value": "{{ $json.valor }}" }
]
}
}
4. Performance
// ✅ Bom: Cálculos eficientes
{
"name": "total",
"value": "{{ $json.preco * $json.quantidade }}"
}
// ❌ Evitar: Cálculos complexos em Set Node
{
"name": "estatisticas",
"value": "{{ $json.itens.reduce((acc, item) => { /* lógica complexa */ }, {}) }}"
}
Troubleshooting
Problemas Comuns
Campo não aparece
- Verifique se o modo está correto
- Confirme se o nome do campo está correto
- Teste com valor simples primeiro
- Verifique se há erros de sintaxe
Valor incorreto
- Verifique a expressão usada
- Confirme se os campos de origem existem
- Teste com dados de exemplo
- Use Debug Helper para ver dados
Performance lenta
- Evite cálculos complexos
- Use expressões simples
- Limite o número de campos
- Considere usar Code Node para lógica complexa
Debug
// Code Node - Debug de Set Node
const debugSetNode = (dados) => {
console.log('=== DEBUG SET NODE ===');
console.log('Dados de entrada:', dados);
console.log('Campos disponíveis:', Object.keys(dados));
console.log('Tipos de dados:', Object.entries(dados).map(([k, v]) => `${k}: ${typeof v}`));
console.log('========================');
return dados;
};
// Usar antes do Set Node
return { json: debugSetNode($json) };
Integração com Outros Nodes
1. Set Node + If Node
// Set Node - Preparar dados para condição
{
"mode": "keepAllSet",
"values": {
"boolean": [
{
"name": "cliente_valido",
"value": "{{ $json.nome && $json.email && $json.cpf }}"
}
]
}
}
// If Node - Usar campo criado
{
"condition": "{{ $json.cliente_valido }}",
"true": "Processar Cliente",
"false": "Cliente Inválido"
}
2. Set Node + HTTP Request
// Set Node - Preparar dados para API
{
"mode": "keepOnlySet",
"values": {
"string": [
{
"name": "api_key",
"value": "{{ $credentials.apiKey }}"
},
{
"name": "endpoint",
"value": "{{ $json.tipo === 'cliente' ? '/clientes' : '/produtos' }}"
}
],
"object": [
{
"name": "payload",
"value": {
"nome": "{{ $json.nome }}",
"email": "{{ $json.email }}",
"timestamp": "{{ $now.toISOString() }}"
}
}
]
}
}
Próximos Passos
- Code Node - Lógica customizada
- If Node - Controle de fluxo
- Aggregate Node - Agregação de dados
- Expressões n8n - Usar expressões avançadas
- Data Processing - Outros nodes de processamento