Skip to content
Back to skills

N8n Code Javascript

ASecurity

Escreva código JavaScript em nós Code do n8n. Use quando estiver escrevendo JavaScript no n8n, usando sintaxe $input/$json/$node, fazendo requisições HTTP com $helpers, trabalhando com datas usando DateTime, resolvendo erros do nó Code ou escolhendo entre modos de Code node.

  • 11 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added September 8, 2026
developmentjavascriptpythongojavanodeexpressgitapiperformance

Works with

  • api
  • mcp

Security analysis

A100/100

Pro scans all 6 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add artubss/SKILLS-CLAUDE-CODE --skill n8n-code-javascript --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of N8n Code Javascript?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for N8n Code Javascript
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/artubss-n8n-code-javascript/badge)](https://www.skillsdirectory.com/skills/artubss-n8n-code-javascript)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: n8n-code-javascript
description: Escreva código JavaScript em nós Code do n8n. Use quando estiver escrevendo JavaScript no n8n, usando sintaxe $input/$json/$node, fazendo requisições HTTP com $helpers, trabalhando com datas usando DateTime, resolvendo erros do nó Code ou escolhendo entre modos de Code node.
---

# Nó de Código JavaScript

Orientação especializada para escrever código JavaScript em nós Code do n8n.

---

## Início Rápido

```javascript
// Template básico para nós Code
const items = $input.all();

// Processar dados
const processed = items.map(item => ({
  json: {
    ...item.json,
    processed: true,
    timestamp: new Date().toISOString()
  }
}));

return processed;
```

### Regras Essenciais

1. **Escolha o modo "Run Once for All Items"** (recomendado para a maioria dos casos)
2. **Acesse dados**: `$input.all()`, `$input.first()`, ou `$input.item`
3. **CRÍTICO**: Deve retornar formato `[{json: {...}}]`
4. **CRÍTICO**: Dados de webhook estão sob `$json.body` (não diretamente em `$json`)
5. **Built-ins disponíveis**: $helpers.httpRequest(), DateTime (Luxon), $jmespath()

---

## Guia de Seleção de Modo

O nó Code oferece dois modos de execução. Escolha de acordo com seu caso de uso:

### Run Once for All Items (Recomendado - Padrão)

**Use este modo para:** 95% dos casos de uso

- **Como funciona**: Código executa **uma única vez** independente da quantidade de entradas
- **Acesso a dados**: `$input.all()` ou array `items`
- **Melhor para**: Agregação, filtragem, processamento em lote, transformações, chamadas API com todos os dados
- **Performance**: Mais rápido para múltiplos itens (execução única)

```javascript
// Exemplo: Calcular total de todos os itens
const allItems = $input.all();
const total = allItems.reduce((sum, item) => sum + (item.json.amount || 0), 0);

return [{
  json: {
    total,
    count: allItems.length,
    average: total / allItems.length
  }
}];
```

**Quando usar:**
- ✅ Comparar itens em todo o conjunto de dados
- ✅ Calcular totais, médias ou estatísticas
- ✅ Ordenar ou classificar itens
- ✅ Remover duplicatas
- ✅ Construir relatórios agregados
- ✅ Combinar dados de múltiplos itens

### Run Once for Each Item

**Use este modo para:** Casos especializados apenas

- **Como funciona**: Código executa **separadamente** para cada item de entrada
- **Acesso a dados**: `$input.item` ou `$item`
- **Melhor para**: Lógica específica de item, operações independentes, validação por item
- **Performance**: Mais lento para grandes conjuntos de dados (múltiplas execuções)

```javascript
// Exemplo: Adicionar timestamp de processamento a cada item
const item = $input.item;

return [{
  json: {
    ...item.json,
    processed: true,
    processedAt: new Date().toISOString()
  }
}];
```

**Quando usar:**
- ✅ Cada item precisa de chamada API independente
- ✅ Validação por item com tratamento de erro diferente
- ✅ Transformações específicas do item baseadas em propriedades do item
- ✅ Quando itens devem ser processados separadamente por lógica de negócio

**Atalho de Decisão:**
- **Precisa examinar múltiplos itens?** → Use o modo "All Items"
- **Cada item é completamente independente?** → Use o modo "Each Item"
- **Não tem certeza?** → Use o modo "All Items" (você sempre pode fazer loop dentro)

---

## Padrões de Acesso a Dados

### Padrão 1: $input.all() - Mais Comum

**Use quando**: Processar arrays, operações em lote, agregações

```javascript
// Obter todos os itens do nó anterior
const allItems = $input.all();

// Filtrar, mapear, reduzir conforme necessário
const valid = allItems.filter(item => item.json.status === 'active');
const mapped = valid.map(item => ({
  json: {
    id: item.json.id,
    name: item.json.name
  }
}));

return mapped;
```

### Padrão 2: $input.first() - Muito Comum

**Use quando**: Trabalhar com objetos únicos, respostas de API, primeiro a entrar primeiro a sair

```javascript
// Obter apenas o primeiro item
const firstItem = $input.first();
const data = firstItem.json;

return [{
  json: {
    result: processData(data),
    processedAt: new Date().toISOString()
  }
}];
```

### Padrão 3: $input.item - Apenas Modo Each Item

**Use quando**: No modo "Run Once for Each Item"

```javascript
// Item atual no loop (apenas modo Each Item)
const currentItem = $input.item;

return [{
  json: {
    ...currentItem.json,
    itemProcessed: true
  }
}];
```

### Padrão 4: $node - Referenciar Outros Nós

**Use quando**: Precisar de dados de nós específicos no workflow

```javascript
// Obter saída de nó específico
const webhookData = $node["Webhook"].json;
const httpData = $node["HTTP Request"].json;

return [{
  json: {
    combined: {
      webhook: webhookData,
      api: httpData
    }
  }
}];
```

**Veja**: [DATA_ACCESS.md](DATA_ACCESS.md) para guia completo

---

## Crítico: Estrutura de Dados de Webhook

**ERRO MAIS COMUM**: Dados de webhook estão aninhados sob `.body`

```javascript
// ❌ ERRADO - Retornará undefined
const name = $json.name;
const email = $json.email;

// ✅ CORRETO - Dados de webhook estão sob .body
const name = $json.body.name;
const email = $json.body.email;

// Ou com $input
const webhookData = $input.first().json.body;
const name = webhookData.name;
```

**Por quê**: O nó webhook envolve todos os dados de requisição sob a propriedade `body`. Isso inclui dados POST, parâmetros de query e payloads JSON.

**Veja**: [DATA_ACCESS.md](DATA_ACCESS.md) para detalhes completos da estrutura de webhook

---

## Requisitos de Formato de Retorno

**REGRA CRÍTICA**: Sempre retorne array de objetos com propriedade `json`

### Formatos de Retorno Corretos

```javascript
// ✅ Resultado único
return [{
  json: {
    field1: value1,
    field2: value2
  }
}];

// ✅ Múltiplos resultados
return [
  {json: {id: 1, data: 'first'}},
  {json: {id: 2, data: 'second'}}
];

// ✅ Array transformado
const transformed = $input.all()
  .filter(item => item.json.valid)
  .map(item => ({
    json: {
      id: item.json.id,
      processed: true
    }
  }));
return transformed;

// ✅ Resultado vazio (quando não houver dados para retornar)
return [];

// ✅ Retorno condicional
if (shouldProcess) {
  return [{json: processedData}];
} else {
  return [];
}
```

### Formatos de Retorno Incorretos

```javascript
// ❌ ERRADO: Objeto sem wrapper de array
return {
  json: {field: value}
};

// ❌ ERRADO: Array sem wrapper json
return [{field: value}];

// ❌ ERRADO: String simples
return "processed";

// ❌ ERRADO: Dados brutos sem mapeamento
return $input.all();  // Falta .map()

// ❌ ERRADO: Estrutura incompleta
return [{data: value}];  // Deveria ser {json: value}
```

**Por que importa**: Nós seguintes esperam formato de array. Formato incorreto causa falha na execução do workflow.

**Veja**: [ERROR_PATTERNS.md](ERROR_PATTERNS.md) #3 para soluções detalhadas de erro

---

## Visão Geral de Padrões Comuns

Com base em workflows de produção, aqui estão os padrões mais úteis:

### 1. Agregação de Dados de Múltiplas Fontes
Combine dados de múltiplas APIs, webhooks ou nós

```javascript
const allItems = $input.all();
const results = [];

for (const item of allItems) {
  const sourceName = item.json.name || 'Unknown';
  // Analisar estrutura específica da fonte
  if (sourceName === 'API1' && item.json.data) {
    results.push({
      json: {
        title: item.json.data.title,
        source: 'API1'
      }
    });
  }
}

return results;
```

### 2. Filtragem com Regex
Extrair padrões, menções ou palavras-chave de texto

```javascript
const pattern = /\b([A-Z]{2,5})\b/g;
const matches = {};

for (const item of $input.all()) {
  const text = item.json.text;
  const found = text.match(pattern);

  if (found) {
    found.forEach(match => {
      matches[match] = (matches[match] || 0) + 1;
    });
  }
}

return [{json: {matches}}];
```

### 3. Transformação e Enriquecimento de Dados
Mapear campos, normalizar formatos, adicionar campos calculados

```javascript
const items = $input.all();

return items.map(item => {
  const data = item.json;
  const nameParts = data.name.split(' ');

  return {
    json: {
      first_name: nameParts[0],
      last_name: nameParts.slice(1).join(' '),
      email: data.email,
      created_at: new Date().toISOString()
    }
  };
});
```

### 4. Filtragem Top N e Ranking
Ordenar e limitar resultados

```javascript
const items = $input.all();

const topItems = items
  .sort((a, b) => (b.json.score || 0) - (a.json.score || 0))
  .slice(0, 10);

return topItems.map(item => ({json: item.json}));
```

### 5. Agregação e Relatórios
Somar, contar, agrupar dados

```javascript
const items = $input.all();
const total = items.reduce((sum, item) => sum + (item.json.amount || 0), 0);

return [{
  json: {
    total,
    count: items.length,
    average: total / items.length,
    timestamp: new Date().toISOString()
  }
}];
```

**Veja**: [COMMON_PATTERNS.md](COMMON_PATTERNS.md) para 10 padrões de produção detalhados

---

## Prevenção de Erros - Top 5 Equívocos

### #1: Código Vazio ou Falta de Return (Mais Comum)

```javascript
// ❌ ERRADO: Sem statement de return
const items = $input.all();
// ... código de processamento ...
// Esqueceu de retornar!

// ✅ CORRETO: Sempre retornar dados
const items = $input.all();
// ... processamento ...
return items.map(item => ({json: item.json}));
```

### #2: Confusão de Sintaxe de Expressão

```javascript
// ❌ ERRADO: Usando sintaxe de expressão n8n em código
const value = "{{ $json.field }}";

// ✅ CORRETO: Use template literals JavaScript
const value = `${$json.field}`;

// ✅ CORRETO: Acesso direto
const value = $input.first().json.field;
```

### #3: Wrapper de Retorno Incorreto

```javascript
// ❌ ERRADO: Retornando objeto em vez de array
return {json: {result: 'success'}};

// ✅ CORRETO: Wrapper de array obrigatório
return [{json: {result: 'success'}}];
```

### #4: Falta de Verificações de Null

```javascript
// ❌ ERRADO: Quebra se campo não existir
const value = item.json.user.email;

// ✅ CORRETO: Acesso seguro com optional chaining
const value = item.json?.user?.email || 'no-email@example.com';

// ✅ CORRETO: Guard clause
if (!item.json.user) {
  return [];
}
const value = item.json.user.email;
```

### #5: Aninhamento de Body de Webhook

```javascript
// ❌ ERRADO: Acesso direto a dados de webhook
const email = $json.email;

// ✅ CORRETO: Dados de webhook sob .body
const email = $json.body.email;
```

**Veja**: [ERROR_PATTERNS.md](ERROR_PATTERNS.md) para guia completo de erros

---

## Funções Built-in e Helpers

### $helpers.httpRequest()

Fazer requisições HTTP dentro do código:

```javascript
const response = await $helpers.httpRequest({
  method: 'GET',
  url: 'https://api.example.com/data',
  headers: {
    'Authorization': 'Bearer token',
    'Content-Type': 'application/json'
  }
});

return [{json: {data: response}}];
```

### DateTime (Luxon)

Operações de data e hora:

```javascript
// Hora atual
const now = DateTime.now();

// Formatar datas
const formatted = now.toFormat('yyyy-MM-dd');
const iso = now.toISO();

// Aritmética de data
const tomorrow = now.plus({days: 1});
const lastWeek = now.minus({weeks: 1});

return [{
  json: {
    today: formatted,
    tomorrow: tomorrow.toFormat('yyyy-MM-dd')
  }
}];
```

### $jmespath()

Consultar estruturas JSON:

```javascript
const data = $input.first().json;

// Filtrar array
const adults = $jmespath(data, 'users[?age >= `18`]');

// Extrair campos
const names = $jmespath(data, 'users[*].name');

return [{json: {adults, names}}];
```

**Veja**: [BUILTIN_FUNCTIONS.md](BUILTIN_FUNCTIONS.md) para referência completa

---

## Melhores Práticas

### 1. Sempre Validar Dados de Entrada

```javascript
const items = $input.all();

// Verificar se dados existem
if (!items || items.length === 0) {
  return [];
}

// Validar estrutura
if (!items[0].json) {
  return [{json: {error: 'Formato de entrada inválido'}}];
}

// Continuar processamento...
```

### 2. Usar Try-Catch para Tratamento de Erro

```javascript
try {
  const response = await $helpers.httpRequest({
    url: 'https://api.example.com/data'
  });

  return [{json: {success: true, data: response}}];
} catch (error) {
  return [{
    json: {
      success: false,
      error: error.message
    }
  }];
}
```

### 3. Preferir Métodos de Array sobre Loops

```javascript
// ✅ BOM: Abordagem funcional
const processed = $input.all()
  .filter(item => item.json.valid)
  .map(item => ({json: {id: item.json.id}}));

// ❌ MAIS LENTO: Loop manual
const processed = [];
for (const item of $input.all()) {
  if (item.json.valid) {
    processed.push({json: {id: item.json.id}});
  }
}
```

### 4. Filtrar Cedo, Processar Tarde

```javascript
// ✅ BOM: Filtrar primeiro para reduzir processamento
const processed = $input.all()
  .filter(item => item.json.status === 'active')  // Reduzir dataset primeiro
  .map(item => expensiveTransformation(item));  // Depois transformar

// ❌ DESPERDÍCIO: Transformar tudo, depois filtrar
const processed = $input.all()
  .map(item => expensiveTransformation(item))  // Desperdiça CPU
  .filter(item => item.json.status === 'active');
```

### 5. Usar Nomes de Variável Descritivos

```javascript
// ✅ BOM: Intenção clara
const activeUsers = $input.all().filter(item => item.json.active);
const totalRevenue = activeUsers.reduce((sum, user) => sum + user.json.revenue, 0);

// ❌ RUIM: Propósito unclear
const a = $input.all().filter(item => item.json.active);
const t = a.reduce((s, u) => s + u.json.revenue, 0);
```

### 6. Depurar com console.log()

```javascript
// Statements de debug aparecem no console do navegador
const items = $input.all();
console.log(`Processando ${items.length} itens`);

for (const item of items) {
  console.log('Dados do item:', item.json);
  // Processar...
}

return result;
```

---

## Quando Usar Code Node

Use Code node quando:
- ✅ Transformações complexas exigindo múltiplas etapas
- ✅ Cálculos customizados ou lógica de negócio
- ✅ Operações recursivas
- ✅ Parsing de resposta de API com estrutura complexa
- ✅ Condicionais multi-passo
- ✅ Agregação de dados entre itens

Considere outros nós quando:
- ❌ Mapeamento simples de campo → Use nó **Set**
- ❌ Filtragem básica → Use nó **Filter**
- ❌ Condicionais simples → Use nó **IF** ou **Switch**
- ❌ Apenas requisições HTTP → Use nó **HTTP Request**

**Code node é excelente em**: Lógica complexa que exigiria encadear muitos nós simples

---

## Integração com Outras Skills

### Funciona Com:

**Sintaxe de Expressão n8n**:
- Expressões usam sintaxe `{{ }}` em outros nós
- Nós Code usam JavaScript direto (sem `{{ }}`)
- Quando usar expressões vs código

**n8n MCP Tools Expert**:
- Como encontrar Code node: `search_nodes({query: "code"})`
- Obter ajuda de configuração: `get_node_essentials("nodes-base.code")`
- Validar código: `validate_node_operation()`

**n8n Node Configuration**:
- Seleção de modo (All Items vs Each Item)
- Seleção de linguagem (JavaScript vs Python)
- Entender dependências de propriedade

**n8n Workflow Patterns**:
- Code nodes em passo de transformação
- Padrão Webhook → Code → API
- Tratamento de erro em workflows

**n8n Validation Expert**:
- Validar configuração de Code node
- Tratar erros de validação
- Auto-corrigir problemas comuns

---

## Checklist de Referência Rápida

Antes de implantar Code nodes, verifique:

- [ ] **Código não está vazio** - Deve ter lógica significativa
- [ ] **Statement de return existe** - Deve retornar array de objetos
- [ ] **Formato de retorno correto** - Cada item: `{json: {...}}`
- [ ] **Acesso a dados correto** - Usando `$input.all()`, `$input.first()`, ou `$input.item`
- [ ] **Sem expressões n8n** - Use template literals JavaScript: `` `${value}` ``
- [ ] **Tratamento de erro** - Guard clauses para entradas null/undefined
- [ ] **Dados de webhook** - Acessar via `.body` se vindo de webhook
- [ ] **Seleção de modo** - "All Items" para a maioria dos casos
- [ ] **Performance** - Preferir map/filter sobre loops manuais
- [ ] **Saída consistente** - Todos os caminhos de código retornam mesma estrutura

---

## Recursos Adicionais

### Arquivos Relacionados
- [DATA_ACCESS.md](DATA_ACCESS.md) - Padrões completos de acesso a dados
- [COMMON_PATTERNS.md](COMMON_PATTERNS.md) - 10 padrões testados em produção
- [ERROR_PATTERNS.md](ERROR_PATTERNS.md) - Top 5 erros e soluções
- [BUILTIN_FUNCTIONS.md](BUILTIN_FUNCTIONS.md) - Referência completa de built-ins

### Documentação n8n
- Guia de Code Node: https://docs.n8n.io/code/code-node/
- Métodos Built-in: https://docs.n8n.io/code-examples/methods-variables-reference/
- Documentação Luxon: https://moment.github.io/luxon/

---

**Pronto para escrever JavaScript em nós Code do n8n!** Comece com transformações simples, use o guia de padrões de erro para evitar erros comuns, e consulte a biblioteca de padrões para exemplos prontos para produção.

Files in this skill

  • BUILTIN_FUNCTIONS.md16.5 KB
  • COMMON_PATTERNS.md28.5 KB
  • DATA_ACCESS.md15.7 KB
  • ERROR_PATTERNS.md16 KB
  • README.md9.3 KB
  • SKILL.md16.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…