Sandbox no servidor, API de context, valores de retorno, timeout e transformações customizadas.
Nó JavaScript
O nó JavaScript (js_code) executa JavaScript customizado no servidor dentro de uma VM em sandbox. Use quando variáveis de template e operadores de Condição não bastam — parse de respostas de API bagunçadas, agregados, moldagem de JSON ou regras de negócio em código.
Disponível em Lógica em Automações.
Figura 1: Nó JavaScript com editor de código server-side
O que faz
O engine:
- Envolve seu código em uma IIFE async:
(async function() { /* your code */ })(). - Executa em VM isolada com timeout de 10 segundos.
- Injeta um sandbox controlado (veja abaixo).
- Armazena o valor de retorno como saída do nó; se o retorno não for objeto com chave
result, é encapsulado como{ result: <value> }. - Disponibiliza a saída em
{{js_1.result}}e emcontext.nodes.
console.log / warn / error escrevem nos logs do servidor com prefixo [WF-JS] — útil para depuração, não retornado ao cliente.
Como configurar
Clique duas vezes no nó JavaScript e edite o campo Code.
API do sandbox
Globais disponíveis dentro do script:
| Nome | Descrição |
|---|---|
context | Contexto completo do workflow (trigger, variables, nodes, company, …) |
input | Saída do nó imediatamente anterior (context.input) |
trigger | Payload do trigger — trigger.body, trigger.query, etc. |
variables | Mapa mutável de variáveis de execução — atribua variables.key = value para expor via {{variables.key}} |
nodes | Mapa de saídas de nós anteriores por ID do nó |
company | { id, members, … } quando hidratado |
JSON, Date, Math, Array, Object, String, Number, Boolean, RegExp, Error, Promise | Builtins padrão |
parseInt, parseFloat, isNaN, isFinite, encodeURIComponent, decodeURIComponent | Utilitários |
console | log, warn, error → logs do servidor |
Não disponível (bloqueado): require, process, setTimeout, setInterval, filesystem, rede a partir de JS (use nós HTTP para APIs).
Valor de retorno
Use return com qualquer valor serializável em JSON:
const total = (input.data?.items || []).reduce((s, i) => s + i.price, 0);
return { total, currency: 'BRL', item_count: input.data.items.length };
Acesso downstream: {{js_1.result.total}}, {{js_1.result.item_count}}.
Retornos primitivos também funcionam:
return input.data.status === 'paid';
// → { result: true }
Código async
O wrapper é async — você pode usar cadeias await Promise dentro do sandbox apenas (sem HTTP externo a partir de JS).
const rows = await Promise.all(
(input.data.ids || []).map(id => Promise.resolve({ id, ok: true }))
);
return { rows };
Dicas e boas práticas
- Prefira nós declarativos primeiro. HTTP, Variável, Condição e Texto cobrem a maioria dos fluxos — JavaScript adiciona custo de manutenção.
- Mantenha scripts curtos e puros. Input → transform → return. Efeitos colaterais devem ser sobretudo atribuições a
variablesque você documente. - Parse defensivo. APIs mudam; use optional chaining e defaults (
input?.data?.items ?? []). - Não armazene secrets no código. Use globais do workflow ou integration keys para tokens.
- Teste com NodeTestDialog. Passe JSON representativo de
input; inspecioneoutput.resultantes de conectar a Send ou CRM. - Log com moderação.
console.logajuda na depuração mas enche logs em loops apertados — remova ou condicione antes de produção. - Evite loops pesados. Tempo máximo da VM é 10s; grandes volumes de dados devem ser reduzidos upstream (Loop + lotes menores).
Exemplos de uso
Exemplo 1 — Parse de body de webhook não padrão
Trigger: Webhook — ERP envia string aninhada form-encoded.
const raw = trigger.body?.payload || '';
let parsed;
try {
parsed = JSON.parse(raw);
} catch {
parsed = { error: 'invalid_json', raw };
}
variables.order_id = parsed.id;
return parsed;
Próximo: Condição em {{js_1.result.error}} is_empty.
Exemplo 2 — Calcular faixa de frete
const weight = Number(variables.total_weight || input.data.weight || 0);
const region = variables.ship_region || 'default';
let tier = 'standard';
if (weight > 30) tier = 'freight';
else if (weight > 10) tier = 'express';
if (region === 'remote') tier = 'freight';
variables.shipping_tier = tier;
return { tier, weight, region };
Próximo: HTTP da API de frete com {{variables.shipping_tier}}.
Exemplo 3 — Deduplicar lista de contatos antes do Loop
const list = input.data?.contacts || [];
const seen = new Set();
const unique = [];
for (const c of list) {
const phone = String(c.phone || '').replace(/\D/g, '');
if (!phone || seen.has(phone)) continue;
seen.add(phone);
unique.push({ ...c, phone });
}
return { contacts: unique, count: unique.length };
Próximo: Loop em {{js_1.result.contacts}}.
FAQ
JavaScript pode chamar APIs externas?
Não há rede direta a partir do sandbox. Use um nó HTTP antes ou depois do JavaScript.
Por que meu script deu timeout?
A execução excedeu 10 segundos. Reduza tamanho ou complexidade dos dados.
Por que a saída é { result: undefined }?
O script não fez return de valor. Adicione um return explícito.
Posso mutar trigger ou input?
Evite depender de mutações — retorne novos objetos e defina variables para uso downstream com templates.
npm / require é suportado?
Não. Apenas os globais do sandbox listados acima.
JavaScript roda em teste isolado do nó?
Sim. Forneça JSON mock de input / trigger no diálogo de teste conforme necessário.
Artigos relacionados
Este artigo foi útil?
Precisa de mais ajuda? Falar com suporte